{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 第六章 优化算法\n",
    "### 6.1 优化与深度学习"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import d2lzh as d2l\n",
    "import numpy as np\n",
    "# 三维画图\n",
    "from mpl_toolkits import mplot3d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'f(x)')"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 324x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def f(x):\n",
    "    return x * np.cos(np.pi * x)\n",
    "d2l.set_figsize((4.5, 2.5))\n",
    "x = np.arange(-1.0, 2.0, 0.1)\n",
    "# 逗号表示只取返回列表中的第一个元素\n",
    "fig, = d2l.plt.plot(x, f(x))\n",
    "fig.axes.annotate('local minimum', xy=(-0.3, -0.25), xytext=(-0.77, -1.0), arrowprops=dict(arrowstyle='->'))\n",
    "fig.axes.annotate('global minimum', xy=(1.1, -0.95), xytext=(0.6, 0.8), arrowprops=dict(arrowstyle='->'))\n",
    "d2l.plt.xlabel('x')\n",
    "d2l.plt.ylabel('f(x)')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'f(x)')"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 324x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.arange(-2.0, 2.0, 0.1)\n",
    "fig, = d2l.plt.plot(x, x**3)\n",
    "fig.axes.annotate('saddle point', xy=(0, -0.2), xytext=(-0.52, -5.0), arrowprops=dict(arrowstyle='->'))\n",
    "d2l.plt.xlabel('x')\n",
    "d2l.plt.ylabel('f(x)')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 0, 'y')"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 324x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x, y = np.mgrid[-1:1:31j, -1:1:31j]\n",
    "z = x**2 - y**2\n",
    "ax = d2l.plt.figure().add_subplot(111, projection='3d')\n",
    "ax.plot_wireframe(x, y, z, **{'rstride': 2, 'cstride': 2})\n",
    "ax.plot([0], [0], [0], 'rx')\n",
    "ticks = [-1, 0, 1]\n",
    "d2l.plt.xticks(ticks)\n",
    "d2l.plt.yticks(ticks)\n",
    "ax.set_zticks(ticks)\n",
    "d2l.plt.xlabel('x')\n",
    "d2l.plt.ylabel('y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6.2 梯度下降和随机梯度下降"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gd(eta):\n",
    "    x = 10\n",
    "    results = [x]\n",
    "    for i in range(10):\n",
    "        # f(x) = x * x的导数为f'(x) = 2 * x\n",
    "        x -= eta * 2 * x\n",
    "        results.append(x)\n",
    "    print('epoch 10, x:', x)\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 10, x: 0.06046617599999997\n"
     ]
    }
   ],
   "source": [
    "res = gd(0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPkAAAC1CAYAAACd1VmHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAeTElEQVR4nO3dd3hUddr/8fedRgohIZSQnlAk0gndiCJlRVBREFZ0FVFhdVndR91d9bf+1NUtuOtaQRSVFRsWbCCsiqiLLjWAhJolFCGBQIAkBBLS5n7+mMEnYHoyc6Z8X9eVa2bOtM81cnvO+Z5vEVXFMAzv5Wd1AMMwnMsUuWF4OVPkhuHlTJEbhpczRW4YXs4UuWF4uQCrAzRH+/btNTk52eoYhmG5jRs3HlPVDjU959FFnpycTEZGhtUxDMNyIvJDbc857XBdRBaIyFER2VZtW5SIrBCR3Y7bto7tIiLPiUi2iGSKSJqzchmGr3HmOflrwNjztj0ArFTVbsBKx2OAK4Bujr+ZwDwn5jIMz5D5HjzdCx6NtN9mvtekj3FakavqKuDEeZsnAAsd9xcC11Tb/rrarQUiRSTGWdkMw+1lvgdL74aig4Dab5fe3aRCd3XrerSqHnbczwOiHffjgIPVXpfj2NZkqspfl+/khW+ym/MxhmGNlY9BRem52ypK7dsbybJLaGofGdPo0TEiMlNEMkQkIz8/v67XsSf/FK/9Zz9VNjMIx/AwRTmN214HVxf5kbOH4Y7bo47tuUBCtdfFO7b9hKrOV9WBqjqwQ4carxj8aGJaPEeLy/gu+1jzkxuGK0XEN257HVxd5EuAaY7704BPqm2/2dHKPhQoqnZY32SjLuxIm+AAPtzU+P/7GYalRj2MzS/w3G2BITDq4UZ/lDMvoS0C1gDdRSRHRG4DZgNjRGQ3MNrxGGA5sBfIBl4GftUSGVoF+HNV31g+355H8ZmKlvhIw3CNXpMokdaUawCKQEQCXPUc9JnS6I9yWmcYVZ1ay1OjanitArOckWNiWjxvrTvAv7bmMWVQQv1vMAw3ULVrOa2rCpgX/TB3/uq+Zn2W1/ddT0uMJKV9GB+YQ3bDgxR//QwHbR1ISW/8nvt8Xl/kIsLE/nGs23eCgydKrI5jGPXL2UhkfgaL/MczsmezriQDPlDkANf0t/9QH22uscHeMNxK+bfPclJDqexzI0EBzS9RnyjyhKhQhnaO4sNNOZiJKw23VvADAVlLebtqFFcP7t4iH+kTRQ72Brj9x0vYdKDQ6iiGUbt1L2JD+C5qIj1j27TIR/pMkV/RqxPBgX7mmrnhvkoLsW1cyJKqYYwY1A8RaZGP9ZkiDw8OZGzPTizdcogzFVVWxzGMn9q0EL+K0/zTNv7HdqSW4DNFDjBpQDwnz1SyYscRq6MYxrmqKtB1L7JBehN9wWDat27VYh/tU0We3qU9cZEhvLvhYP0vNgxX2v4RcvIQc8vGMnlg4/un18WnitzPT5g8MJ7vso+Za+aG+1CF1c9zOCiJrcGDuKx7xxb9eJ8qcoDJAxMQgfczzN7ccBP7v4W8TOaUXM7V/eNb5Np4dT5X5HGRIQzv1oH3N+aYceaGe1g9h9KgKBZXXsR1A1r2UB18sMgBrh+UwOGiM6zaXfukE4bhEvlZsPtz3vcbS7e49vSMjWjxr/DJIh99YTRRYUG8ZxrgDKutmYvNvxXPFF7C1MGJTvkKnyzyoAA/JvaPY8WOIxw7VWZ1HMNXncqHLe+woc3llAa25eq+sU75Gp8scoCfD0qg0qZ8tMkMWjEssuEVqCrjj8dGcHXfWMKDA+t/TxNYUuQico+IbBeRbSKySESCRSRFRNY5Flh4V0SCnJmhW3Q4aYmRvJtx0AxaMVyvohQ2vExOh0vYUdGJqUOcc6gOFhS5iMQBdwMDVbUX4A9cDzwBPK2qXYEC4DZnZ/n5oASyj55i04ECZ3+VYZxryztQcpy5ZWNJ7RRO3/iWb3A7y6rD9QAgREQCgFDgMDASWOx4vvrCC05zZZ9YwoL8WbTeNMAZLmSzwZq5lLbrxaKjSdwwJLHFBqPUxOVFrqq5wJPAAezFXQRsBApVtdLxsmYvrtAQYa0CmNA/jqVbDlFYUu7srzMMu91fwPHdLAmbSHCgPxP6OfefuhWH622xL4uUAsQCYfx0zbS63t+gxRUa6hdDkiirtLF4oxmCarjImjnYwmP5y/7ujO8dS0SIcxrczrLicH00sE9V81W1AvgQSMe+/tnZ2WNbZHGFhugR24a0xEjeXnfANMAZznfoe9j/LZlxUykqF24Y4vwZhK0o8gPAUBEJFfuJyChgB/A1cJ3jNdUXXnC6XwxNYu+x06zec9xVX2n4qjVzICicJ/KHckF0a9IS2zr9K604J1+HvYFtE7DVkWE+cD9wr4hkA+2AV12VaVzvGNqGBvLm2lrXcTeM5ivKgW0fkn/BFNbkVnDDYOc2uJ3ltMUV6qKqjwCPnLd5LzDYgjgEB/ozeWACr363jyMnzxDdJtiKGIa3W/ciAPPLLicsSJnkhMEoNfHZHm/nu3FIIlU25R1zOc1whjMnYeNCyrpfxcKdNq5Ni3NaD7fzmSJ3SGoXxiUXdGDR+gNUVtmsjmN4m81vQtlJPg2bRHmljZuHJbvsq02RV/OLIYnknTzDyl1H63+xYTRUVSWsnYcmDuOp7a0Z2jmKC6LDXfb1psirGZnakZiIYNMAZ7SsnUug6ABbEm4it7CUaS7ci4Mp8nME+Ptxw+BEvt19jD35p6yOY3gDVftls6guPPVDZ2IighnTI9qlEUyRn2fqkESC/P1YuHq/1VEMb3BgLeRuJL/3bazKPsENgxMJ8Hdt2ZkiP0/71q24ul8sizfmUFRaYXUcw9OtmQMhUcw/OZRAf+F6J83+UhdT5DWYnp5MSXmVmR7KaJ7je2DXMsr7T+edTccY1zuGDuEtt2hCQ5kir0HP2AiGpETx2ur95nKa0XRrXwD/QD5pNZ7iskpuHpZkSQxT5LW49eIUcgtL+XKnWVLJaIKSE7D5LbT3FF7YUEzfhEiX9FOviSnyWoy+MJqEqBAWfLff6iiGJ8p4FSpLWRM9lX3HTjNjeIpL+qnXxBR5Lfz9hGnDklm//wTbcousjmN4ksoyWP8ydB3Ns5n+xEWGMLZnJ8vimCKvw5RBCYQF+bPgP/usjmJ4kq3vw6kj7O02nXX7TjA9Pdnll82qM0VehzbBgUwemMDSLYc4WnzG6jiGJ1CFNXMhuhfP7o2ldasApgxy/sQQdTFFXo9pFyVTaVPeWGO6uhoNsGclHN1BQd+ZLNuax88HJdDGRaPNamOKvB4p7cMYc2E0r6/5gdNllfW/wfBtq+dAeAzzC/pjU2V6erLViSxbXCFSRBaLyC4R2Skiw0QkSkRWiMhux6011xtqcMeILhSVVvCu6Rxj1CVvG+z9mrIBt/PmhsNc0TuG+LahVqeybE/+LPCZqqYCfYGdwAPASlXtBqx0PHYLaYltGZwcxavf7aPCdI4xarNmLgSGspjRFJ+p5PaLU6xOBFgzJXMEcAmOOdxUtVxVC7FP07zQ8TKXLK7QGHeM6ExuYSmfZh6yOorhjk4ehq3vU9XvRuatO8GApLb0t6jzy/ms2JOnAPnAP0Vks4i8IiJhQLSqHna8Jg+ocTxeS8+73lCXde9I9+hwXvr3XjN1s/FT6+eDrZIv20wkp6CUOy/tYnWiH1lR5AFAGjBPVfsDpznv0FztVVRjJbX0vOsNJSLMvKQzu/KK+SbLdf9zMTxA+WnIWICmXsnfN1SQ2imckakdrU71IyuKPAfIcUzNDPbpmdOAIyISA+C4dbs5mK7uF0tsRDAv/nuP1VEMd7L5LThTyPqYG8g+eoo7R3TBz8+aLqw1sWLe9TzgoIh0d2w6u7jCEuyLKoCLF1doqEB/P24b3pl1+06w2ayEagDYqmDtXDR+EH/Z2obEqFDG946xOtU5rGpdvwt4S0QygX7AX4DZwBgR2Y19KaXZFmWr0/WDEogICTR7c8Nu1zIo2M+ulGlsySnijku7WNqFtSZWLa7wPTCwhqdGuThKo4W1CmDasCSe+yqbrLxiundy3aybhhtaMwcik3g8uzMdw0uZNMDpi/E2mnv9L8dD3HpxCq1bBfDcV7utjmJY6eAGOLiOg91vYfW+QmZe0plWAf5Wp/qJBu3JRaQj9pVHY4FSYBuQoao+2TMkMjSIaRcl8cI3e9h9pJhuLpxD23Aja56H4Ahm5w0iMrSUqRbM39YQde7JReQyEfkcWAZcAcQAPYCHgK0i8kcRaeP8mO7n9os7Exroz3NfZVsdxbBCwX7YuZRjqTeyLOskt1yUTFgrS85+61VfqnHADFU9cP4TjrXErwTGAB84IZtbaxsWxM0XJfPiv/fwm1Fd6drR7M19ytp5IH48WXAp4a2EWy5KtjpRrerck6vq72oqcMdzlar6sar6XIGfNWN4Z0IC/Xne7M19S2kBbHqDwi5X805WFdMvTiEyNMjqVLVqUMObiLzh6HN+9nGyiKx0XizPEBUWxE3Dkli65ZBZccWXbHwNKk7zbMlYwoMDuM1NBqLUpqGt698B60RknIjMAL4AnnFaKg8yc7i9RXWu2Zv7hspyWPcSp2LT+eee1swY3pmIEGsnhahPg4pcVV8CbsfeC+0x4BJVXerMYJ6iXetW3DQsiY+/z2XfsdNWxzGcbftHUHyYlyvHExES6BaTQtSnoYfrNwELgJuB14DlItLXibk8ygzH3vzpFf+1OorhTKqw5nlKI7vx7IEkZl7SmXCLp3ZqiIYerk8CLlbVRar6IHAH9mI3gA7hrbj14mSWbDnE9kNm+mavtW8V5G3lbb+raBsaxDQ3blGvrqGH69eo6tFqj9cDQ5yWygPNvKQLESGBPPl5ltVRDGdZM4fy4Hb87VAf7ri0C63d9Lr4+errDPOQiETV9JyqlovISBG50jnRPEtESCB3jujC11n5bNh/wuo4RkvLz4LdX/C+3xVERbTxmL041L8n3wosFZGVIvJ3Efm9iDzsuKS2FbgKWFfPZ/iMacOS6Rjeiif+tcvMHuNt1syhyj+YJ09czD2jLyA40P36qNemviK/TlXTgc+B7YA/cBJ4ExisqveoqpkmxSEkyJ+7R3Uj44cCvs5yuzkvjKY6dRTd8i7L/EbQrmMsE9Pcb6RZXeor8gEiEgvciH1Sh5eA14ENQIiTs3mknw9KIKldKH/7LIsqm9mbe4UNr0BVOU+fGsPvL+/uduPF61Nf2hexT4+cCmRU+9vouDXOE+jvx+8u786uvGI+2JhjdRyjuSpK0fWvsEoGEpXYgzE9apxf1K3V13f9OVW9EFigqp2r/aWoaufmfLGI+Dtma/3U8ThFRNaJSLaIvCsi7tsZuB7je8eQlhjJ37/IMquueLoti5DS48w9M5b7x6ZatvxwczT0EtqdTvju32BfVOGsJ4CnVbUrUADc5oTvdAkR4aEre5BfXMZLq/ZaHcdoKpuNyv/MYat2JurCEQxOqfFCk9uzapmkeGA88IrjsQAjsc/cCm64uEJjpSW25co+McxftYfDRaVWxzGaYvfnBBTsYUHVlTw4/kKr0zSZVS0IzwC/B87OLNMOKFTVs8e2OUCNTZhWLa7QFPePTcWm8HfTQcYjnfr6GXK0PdEXTSGpXZjVcZrMimWSrgSOqurGprzfqsUVmiIhKpRb01P4cFMumTmFVscxGkFzN9M6by3v+49n1shUq+M0ixV78nTgahHZD7yD/TD9WSDSMdsMQDyQa0G2Fvery7rQvnUQjyzZjs1cUnN/me/B073g5RHYVBjWI8UjBqHUxYrFFR5U1XhVTQauB75S1RuBr4HrHC9zy8UVmqJNcCD3j01l84FCFm8yl9TcWuZ7sPRuKDqIAH6iDMl6wr7dg7nTVf37gXtFJBv7OfqrFudpMZPS4hmQ1JbZ/9pFUUmF1XGM2qx8DCrObSSVilL7dg9maZGr6jeqeqXj/l5VHayqXVV1sqqWWZmtJfn5CY9N6ElhSTn/WGEa4dxWUS1HWrVt9xDutCf3aj1jI/jF0CTeXPuDGXPuprRNLWuYRcS7NkgLM0XuQveN6U7b0CD+/8fbTCOcu7HZKCKcnwweDAyBUQ9bEqmlmCJ3oYjQQB64IpVNBwp5e32NM10bFjmz6mkiT2axstUoNCIBEIhIgKuegz5TrI7XLJ4xtYUXuW5APB9/n8vsf+1i9IXRdIoItjqScWAtgd/8meVVg4m/6VUkoa3ViVqU2ZO7mIjwl2t7U2mz8dDH28zkElYrOUHZO7eQY2vH1gF/po+XFTiYIrdEUrsw7h1zAV/uPMLyrXlWx/FdNhtVH/4SKcnn8dDfc9e4NKsTOYUpcovcmp5C77gIHlmyjcKScqvj+KY1c/DP/oI/VdzIrZOvJTTIO89eTZFbJMDfj9mTelNQUsFjS3dYHcf3HFiHfvkon1UNoiLtdi7q0t7qRE5jitxCPWMjmHVZVz7cnMu/th62Oo7vKDmBLp5OHu35R8jdHj2MtCFMkVvsrpFd6RMfwf/7aCtHT56xOo73U4WP78RWfISZZ+7iD5OG0sbDB6DUxxS5xQL9/XhqSj9Kyqu4/4NM09rubGvmwH8/4/HyG0gbehkjune0OpHTmSJ3A107tuaBK1L5OiufResPWh3Hex3cgH75KF/LEL6LmsQDV3j3YfpZpsjdxLRhyaR3bceflu0wa507Q8kJdPEtHPdrz33lM3jm+v6EBHnOAgnNYYrcTfj5CU9O7kurAD9mvbWJMxVVVkfyHqrwySxsJ/O47fSvmPmzNHrFRVidymVMkbuRmIgQnprSj115xfzRXFZrOWtfgKzlzK66gdCUIcwY3qzZxD2OFXO8JYjI1yKyQ0S2i8hvHNujRGSFiOx23Hpf/8IGuCy1I3dc2oVF6w+wZMshq+N4vpwMdMXDfOs/hE+CrubZqf3w9/O8udObw4o9eSVwn6r2AIYCs0SkB/AAsFJVu2FfteUBC7K5hft+dgEDktry4AeZ7Dt22uo4nqu0AH3/Fk74tePu0tt5/oY0Oob73oAgK+Z4O6yqmxz3i7EvsBAHTMA+3zp4wbzrzRHo78fzU/sTGODHL9/I4JRZhaXxVOHjWejJw9x2eha/vHwAQzq3szqVJSw9JxeRZKA/9uWPo1X1bLevPMDzFp1qQbGRIcyZmsae/NPc8+73ZpKJxlo7D7KW8deKqbRPTWemj52HV2dZkYtIa+AD4H9U9WT159TeI6TGf9WetLhCc13crT1/GHchK3Yc4Zkv/2t1HM+RsxFd8TDfMJCvIifxjyl98fOx8/DqrFomKRB7gb+lqh86Nh8RkRjH8zFAjQt8e9LiCi1henoykwfE89xX2SzLNP3b61VaiO39WziqkTwsv+LVWwYTEeLd3VbrY0XrumCfbnmnqj5V7akl2OdbBy+ad725RIQ/XduLtMRIfvv+FrMSS11UsX08C1tRLrPK72L2Ly4lub3nLm/UUqxaQeUmYKSIfO/4GwfMBsaIyG5gtOOxAbQK8OfFmwbQrnUQ0/+5gf2mxb1Guu5F/LI+5a8V1zNpwrVePXy0MaxoXf9OVUVV+6hqP8ffclU9rqqjVLWbqo5W1ROuzubOOoYH8/qtg1Hg5gXryS/2mmnpW0buRmyfP8SKqjT8L/o1UwcnWp3IbZgebx6kc4fWvDptIPnFZUx/bb25tHZWaSHFb97EYVskq3o8xoPjfGPgSUOZIvcw/RPbMvfG/uw8XMzM1zMoLffhPu6OxQn1iSRal+SSEXkFj0xJx97sY5xlitwDjUyN5snJfViz9zgzfLXQz1ucUAQmnF5MwPbFVidzO6bIPdS1/eN58rq+/GfPMWa8nuF7o9ZqWpyw0vMXJ3QGU+QebNKA/yv02xf60B69sgwtqmVyDQ9fnNAZTJF7uEkD4vm7o9BvfGUtBae9fHrnk4c5Nmc0tZ51e/jihM5gitwLXDcgnnk3prHt0EkmvbiagydKrI7kFHpgLaefTyekIIvPWl+LBoSc+wIvWJzQGUyRe4mxvWJ46/YhHD9VzsR5q9mW613LI1euX0DVgvHklwUwr+tLjLpnAXL1c/ZFCb1ocUJnEE+eHXTgwIGakZFhdQy3svtIMdMWrKegpIK/XdeHq/rGWh2peSrLKF1yHyGZb/Dvqj7sTH+GX16eZi6TnUdENqrqwJqeM3tyL9MtOpyPZ6XTM7YNdy3azJ+X7aCyymZ1rKYpzuPU/LGEZL7BfNsECie+xR1jB5gCbyRT5F6oY5tg3p4xlJuHJfHyt/u4fv5ajztPt/2wjtPPp+N3ZDsPB/2O4XfOYUJ/01W1Kczhupf75PtcHvpoGwCPXdOTa/rFueeeMPM9+zXuohyqgiPhTCE5tg68kfRnfj31GiJDg6xO6NbM4boPm9AvjuW/GU5qTDj3vLuF2xZmkFPgZnv1ar3XQPE/UwAKR/vcyR9unWwKvJlMkfuAhKhQ3pk5jIfGX8javccZ89Qq5n2zx316ya384096r/mLMujgAvc86vAwpsh9hL+fcPvwzqy491LSu7bjic92MfLJb1i8MYcqq+aPs1VxZPVbaG291EzvtRZhzsl91OrsY8z+bBeZOUWktA/j9uEpTEqLJzjQSUsHVTvnJiKO452GU7X3WzpW5FCh/gRKDUcVEQlwzzbn5PEydZ2Tu1WRi8hY4FnAH3hFVeucHcYUefPYbMrn2/OY9+89ZOYUERUWxMT+cVw3MJ7UTm0a/4HVCznEsTZGaYH9flkx2CrOeXmOtmf9BfcyumsEbb787bmH7IEhpnNLI3hEkYuIP/BfYAyQA2wApqpqresFmSJvGarK2r0neG31Pr7adZSKKiW1UzgjUzsyMrUjfRMiCfSv4cwu8z349H+gvGnTUdnaxON37/b/+6wf9/Tx9u6ppsAbzFOKfBjwqKpe7nj8IICq/rW295gib3knTpfzyfe5fLYtj4wfCqiyKUEBfvSMbUPvuAgSo0KJbxvKBUeXk/LtbxFtTuOdwKOFLRXdp9VV5AGuDlOHOKD6+MEcYIhFWXxWVFgQ09NTmJ6eQlFpBf/JPsbmAwVsOVjEh5tyf5xy6rugPyN+zWydNyPGXMKdirxBRGQmMBMgMdH0gHKmiJBAxvWOYVzvGMB+WF9UWkFOQSlxLx9v3oebEWMu406X0HKBhGqP4x3bzuFriyu4ExEhMjSIXnERSGP3wv5BEBKFGTHmeu60J98AdBORFOzFfT1wg7WRjFqNehg+vgNstRyyB4ZBQCt767ppSLOU2xS5qlaKyK+Bz7FfQlugqtstjmXU5mzBnt+6HhgGVz1jCtqNuE2RA6jqcmC51TmMBuozxRSzB3Cnc3LDMJzAba6TN4WI5AM/1POy9sAxF8RpKZ6WFzwvszfmTVLVGluiPbrIG0JEMmrrJOCOPC0veF5mX8trDtcNw8uZIjcML+cLRT7f6gCN5Gl5wfMy+1Rerz8nNwxf5wt7csPwaV5b5CIyWUS2i4hNRAae99yDIpItIlkicrlVGWsjIo+KSK6IfO/4G2d1ppqIyFjHb5gtIg9YnachRGS/iGx1/K5uN05ZRBaIyFER2VZtW5SIrBCR3Y7bto35TK8tcmAbMBFYVX2jiPTA3i++JzAWeMExYYW7eVpV+zn+3K4XoOM3mwtcAfQApjp+W09wmeN3dcfLaK9h/3dZ3QPASlXtBqx0PG4wry1yVd2pqlk1PDUBeEdVy1R1H5ANDHZtOq8wGMhW1b2qWg68g/23NZpBVVcBJ87bPAFY6Li/ELimMZ/ptUVeh5omp4izKEtdfi0imY7Dt0YdnrmIp/yO51PgCxHZ6JibwBNEq+phx/08ILoxb3arASqNJSJfAp1qeOoPqvqJq/M0Rl3ZgXnA49j/QT4O/AO41XXpvNrFqporIh2BFSKyy7H39AiqqiLSqEtiHl3kqjq6CW9r0OQUztbQ7CLyMvCpk+M0hVv8jo2lqrmO26Mi8hH20w53L/IjIhKjqodFJAY42pg3++Lh+hLgehFp5Zigohuw3uJM53D8hzzrWuyNiO7mx0k+RCQIe2PmEosz1UlEwkQk/Ox94Ge45297viXANMf9aUCjjlI9ek9eFxG5Fnge6AAsE5HvVfVyVd0uIu8BO4BKYJZqs6YcdYa/iUg/7Ifr+4FfWpqmBh46yUc08JFj6aUA4G1V/czaSOcSkUXACKC9iOQAjwCzgfdE5Dbsoy4bNYjf9HgzDC/ni4frhuFTTJEbhpczRW4YXs4UuWF4OVPkhuHlTJEbhpczRW4YXs4UudEkIjLIMYAm2NGTbLuI9LI6l/FTpjOM0WQi8icgGAgBcupaS96wjilyo8kcfdY3AGeAi9ywe7CBOVw3mqcd0BoIx75HN9yQ2ZMbTSYiS7DPCJMCxKjqry2OZNTAa0ehGc4lIjcDFar6tmO+t9UiMlJVv7I6m3Eusyc3DC9nzskNw8uZIjcML2eK3DC8nClyw/BypsgNw8uZIjcML2eK3DC8nClyw/By/wtnmYD8AgRsNAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def show_trace(res):\n",
    "    n = max(abs(min(res)), abs(max(res)), 10)\n",
    "    # x的取值\n",
    "    f_line = np.arange(-n, n, 0.1)\n",
    "    d2l.set_figsize()\n",
    "    d2l.plt.plot(f_line, [x*x for x in f_line])\n",
    "    d2l.plt.plot(res, [x*x for x in res], '-o')\n",
    "    d2l.plt.xlabel('x')\n",
    "    d2l.plt.ylabel('f(x)')\n",
    "show_trace(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 10, x: 3.4867844009999995\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_trace(gd(0.05))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 10, x: 61.917364224000096\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_trace(gd(1.1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_2d(trainer):\n",
    "    # s1和s2是自变量状态，本章后续几节会使用\n",
    "    x1, x2, s1, s2 = -5, -2, 0, 0\n",
    "    results = [(x1, x2)]\n",
    "    for i in range(20):\n",
    "        x1, x2, s1, s2 = trainer(x1, x2, s1, s2)\n",
    "        results.append((x1, x2))\n",
    "    print('epoch %d, x1 %f, x2 %f' % (i+1, x1, x2))\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def show_trace_2d(f, results):\n",
    "    d2l.plt.plot(*zip(*results), '-o', color='#ff7f0e')\n",
    "    x1, x2 = np.meshgrid(np.arange(-5.5, 1.0, 0.1), np.arange(-3.0, 1.0, 0.1))\n",
    "    d2l.plt.contour(x1, x2, f(x1, x2), colors='#1f77b4')\n",
    "    d2l.plt.xlabel('x1')\n",
    "    d2l.plt.ylabel('x2')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 20, x1 -0.057646, x2 -0.000073\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "eta = 0.1\n",
    "# 目标函数\n",
    "def f_2d(x1, x2):\n",
    "    return x1**2+2*x2**2\n",
    "def gd_2d(x1, x2, s1, s2):\n",
    "    return (x1-eta*2*x1, x2-eta*4*x2, 0, 0)\n",
    "show_trace_2d(f_2d, train_2d(gd_2d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 20, x1 -0.108894, x2 0.013042\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def sgd_2d(x1, x2, s1, s2):\n",
    "    return (x1-eta*(2*x1+np.random.normal(0.1)), \n",
    "            x2-eta*(4*x2+np.random.normal(0.1)), 0, 0)\n",
    "show_trace_2d(f_2d, train_2d(sgd_2d))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6.3 小批量随机梯度下降"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1500, 5])"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "def get_data_ch7():\n",
    "    # 数据读取以\\t分隔\n",
    "    data = np.genfromtxt('data/airfoil_self_noise.dat', delimiter='\\t')\n",
    "    # 特征标准化处理\n",
    "    data = (data - data.mean(axis=0)) / data.std(axis=0)\n",
    "    # 最后一列是label\n",
    "    # 前1500个样本(每个样本5个特征)\n",
    "    return torch.tensor(data[:1500, :-1], dtype=torch.float32), torch.tensor(data[:1500, -1], dtype=torch.float32)\n",
    "features, labels = get_data_ch7()\n",
    "features.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sgd(params, states, hyperparms):\n",
    "    for p in params:\n",
    "        # 学习率衰减的参数更新\n",
    "        p.data -= hyperparms['lr'] * p.grad.data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import d2lzh as d2l\n",
    "import time\n",
    "def train_ch7(optimizer_fn, states, hyperparams, features, labels, batch_size=10, num_epochs=2):\n",
    "    # 初始化模型\n",
    "    net, loss = d2l.linreg, d2l.squared_loss\n",
    "    w = torch.nn.Parameter(torch.tensor(np.random.normal(0, 0.01, size=(features.shape[1], 1)), dtype=torch.float32), requires_grad=True)\n",
    "    b = torch.nn.Parameter(torch.zeros(1, dtype=torch.float32), requires_grad=True)\n",
    "    def eval_loss():\n",
    "        return loss(net(features, w, b), labels).mean().item()\n",
    "    ls = [eval_loss()]\n",
    "    data_iter = torch.utils.data.DataLoader(torch.utils.data.TensorDataset(features, labels), batch_size, shuffle=True)\n",
    "    for _ in range(num_epochs):\n",
    "        start = time.time()\n",
    "        for batch_i, (X, y) in enumerate(data_iter):\n",
    "            # 使用平均损失\n",
    "            l = loss(net(X, w, b), y).mean()\n",
    "            # 梯度清零\n",
    "            if w.grad is not None:\n",
    "                w.grad.data.zero_()\n",
    "                b.grad.data.zero_()\n",
    "            l.backward()\n",
    "            # 迭代模型参数\n",
    "            optimizer_fn([w, b], states, hyperparams)\n",
    "            # 每100个样本记录下当前训练误差\n",
    "            if (batch_i + 1) * batch_size % 100 == 0:\n",
    "                ls.append(eval_loss())\n",
    "    # 打印结果和作图\n",
    "    print('loss: %f, %f sec per epoch' % (ls[-1], time.time()-start))\n",
    "    d2l.set_figsize()\n",
    "    d2l.plt.plot(np.linspace(0, num_epochs, len(ls)), ls)\n",
    "    d2l.plt.xlabel('epoch')\n",
    "    d2l.plt.ylabel('loss')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.247478, 0.051707 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPwAAAC4CAYAAADHYoEdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAVK0lEQVR4nO3deXAc5ZnH8e9vRrLkQ/I1gzEGWTYaBXA4rWCCPUo2BzgJBakNBEMgOEd52SIbkmxtEjbJpiqprWI3u9ls1bIJLCRrEjaEhYRyliRAwmVz2TIYCAbfNrYxvo18ypb07B/dYw9Cssa2WnP086lSaabn7dYz4Kf77e6330dmhnMuHhLFDsA5N3g84Z2LEU9452LEE965GPGEdy5GPOGdi5FIE17STEnLJK2U9M1ePp8taaukJeHPF/M+u0HSivDnhijjdC4uFNV9eElJYDnwUWADsAi4xsyW5rWZDbSY2Zd6rDsGaANaAAMWA1PNbGckwToXE1Ee4S8EVprZajM7CNwLXFHgupcCj5rZjjDJHwVmRhSnc7FRFeG2JwDr895vAKb10u5TkloJegNfNbP1faw74Wh/LJVKWWNj4wkF7FylWLx48TYzS/dcHmXCF+K3wC/NrEPSXwFzgQ8VurKkOcAcgIaGBtra2qKJ0rkyI2ldb8uj7NJvBE7Le39quOwwM9tuZh3h2zuBqYWuG65/h5m1mFlLOv2unZlzrocoE34RkJE0SdIQYBYwL7+BpPF5by8HXgtfPwxcImm0pNHAJeEy59wJiKxLb2adkr5EkKhJ4Kdm9qqk7wFtZjYP+LKky4FOYAcwO1x3h6TvE+w0AL5nZjuiitW5uIjsttxga2lpsaOdwz/++hbufnYt//XZFqqSPt7IVTZJi82spefy2PzL39PRyePLtvLyxreLHYpzRRObhJ/elEKC+cu3FTsU54omNgk/ZvgQzp4wkvkrthY7FOeKJjYJD5DNpHhx/S52HzhU7FCcK4pYJfyMpjRd3cazq7YXOxTniiJWCX/BxFEMG5Jk/go/j3fxFKuEr6lKctHksSxY6Qnv4ilWCQ8woynFmm17Wb9jX7FDcW7QxS7hW5tTAN6td7EUu4Q/PT2C8SNrWbDSb8+5+IldwktiRlOKBSu20dVdGcOKnStU7BIeINucpv1AJy9v2FXsUJwbVLFM+Bm5YbZ+Hu9iJpYJP2b4EKacUs8CT3gXM7FMeIBsJs0Lb+z0YbYuVmKc8Ck6u43nVvu8Gi4+YpvwUyeOZmh1kgX+9JyLkaJWnslr9ylJJqklfN8oaX9eRZqfDHRsNVVJpk0e4xfuXKxElvBh5ZnbgI8BZwHXSDqrl3Z1wM3A8z0+WmVm54U/N0YRYzaTZvW2vWzY6cNsXTyUQuWZ7wP/BByIMJZetWaCYbZ+td7FRZQJ32/1GEkXAKeZ2UO9rD9J0ouSnpSUjSLAppNGMK6+xrv1LjaKVnlGUgL4IeHU1D1sAhrMbLukqcCDkqaYWXuPbbyj8sxxxEA2k+bRpZvp6jaSCR3zNpwrJ8WsPFMHvBd4QtJa4CJgnqQWM+sws+0AZrYYWAU09/wDA1F5JptJ8fb+Q/zZZ7N1MVC0yjNm9raZpcys0cwageeAy82sTVI6vOiHpMlABlgdRZDTm3KPy/rtOVf5Ikt4M+sEcpVnXgPuy1WeCavNHE0r8LKkJcD9wI1RVZ5Jjahhyin1POXn8S4GIj2HN7PfAb/rsewf+mj7wbzXDwAPRBlbvmwmzV0LVrOno5MRNcUuqOtcdGI70i5fNpPiUJfx/GqfzdZVNk94gmG2tdUJvz3nKp4nPFBbnWTapLF+4c5VPE/4UDaTYtXWvWzctb/YoTgXGU/4UDYT3Mf3p+dcJfOEDzWPG8FJdT7M1lU2T/hQbpjtgpU+m62rXJ7webKZFLv2HeLVN32YratMnvB5jgyz9W69q0ye8HnSdTWcNb7eb8+5iuUJ30M2k2Lxup3s7egsdijODThP+B6ymXQwzHaND7N1lccTvoeWxtHUVPkwW1eZPOF7qK1OcuEkn83WVSZP+F60ZtKs3LKHTW/7MFtXWTzhe5Ft9ttzrjKVZCGKcNkt4XrLJF0aZZw9vWdcHWkfZusqUGTTu+QVovgowRTViyTNM7OlPdq9qxBFWLBiFjAFOAX4o6RmM+uKKt4eMZFtSvHE8q10dxsJn83WVYhSLURxBXBvOHvtGmBluL1Bk21OsWPvQZZuau+/sXNlolQLUfS7btRyw2yf8lF3roIU7aJdXiGKvz2BbcyR1CapbevWgU3Mk+pqOePkOuYv9/N4VzlKshBFAesCA1OI4mham9MsXreTfQd9mK2rDCVZiCJsN0tSjaRJBIUoFkYYa6+ymRQHu7p5fk0kU+I7N+hKshCFmb0K3AcsBf4A3DRYV+jzva9xDEOqEt6tdxWjJAtRhO//EfjHyIIrQDCb7RgWrPQLd64y+Ei7fmQzKZZv3sNbbw96+XrnBpwnfD9mNAUXA31SDFcJPOH7ccbJdaRG+DBbVxk84fuRSIhsJsXTK7fR7bPZujJXUMJLullSvQJ3SXpB0iVRB1cqZjSl2O7DbF0FKPQI/3kzawcuAUYD1wO3RhZViclm/HFZVxkKTfjc42IfB34e3iePzSNkJ9UHw2z99pwrd4Um/GJJjxAk/MPhI63d0YVVemY0pVi0Zif7Dw76+B/nBkyhCf8F4JvA+8xsH1ANfC6yqEpQtjkdDrP12Wxd+So04d8PLDOzXZKuA74NxKoe04XhMNsFfh7vylihCf9jYJ+kcwkeZ10F3B1ZVCVo6JAk72sc7RfuXFkrNOE7zcwIZqL5DzO7jeDx1ljJZtIs27ybze0+zNaVp0ITfrekWwhuxz0UTl5RHV1YpSl3e8679a5cFZrwVwMdBPfj3yKYkOIHkUVVos48uZ7UiCE+rt6VrYISPkzye4CRki4DDphZrM7hIRhmO70pxQIfZuvKVKFDaz9NMOPMVcCngeclXRllYKUqm0mzbc9BXn9rd7FDce6YFdql/xbBPfgbzOyzBFNGf6e/lforRCHpRkmvSFoiaUE4Hz2SGiXtD5cvkfSTY/lSUToyzNa79a78FJrwCTPbkvd+e3/r5hWi+BhwFnBNLqHz/I+ZnW1m5wH/TDCLbc4qMzsv/LmxwDgjN66+luZxI/z2nCtLhSb8HyQ9LGm2pNnAQ/SYuqoX/RaiCB/IyRkOlMWJcTaTZuHaHRw45MNsXXkp9KLd3wF3AOeEP3eY2Tf6Wa2gYhKSbpK0iuAI/+W8jyZJelHSk5KyhcQ5WLKZFAc7u1nos9m6MlPwJJZm9gDwwEAHEA7iuU3StQRDdm8ANgENZrZd0lTgQUlTevQIkDQHmAPQ0NAw0KH1adqksQxJJpi/YiutzQM/H75zUenvPHy3pPZefnZL6m82iIKKSeS5F/gkQFhTbnv4ejHBUN7mnitEXYiiL0OHJGnxYbauDB014c2szszqe/mpM7P6frZ91EIUAJIyeW8/AawIl6fDi35ImkxQiGL1sX21aGUzaV5/azdbfJitKyPFLkTxJUmvSloCfI2gOw/QCrwcLr8fuNHMSuqE+fAw25V+lHflo6iFKMzs5j7Wi+R6wUA6a3w9Y4YPYf6KbfzlBacWOxznCuKz1h6nRELMaEoxf8U2ggcJnSt9nvAnIJtJsW1Phw+zdWXDE/4EZDNelcaVF0/4E3DyyFoyJ/kwW1c+POFPUDaTZuEaH2bryoMn/AnKZlJ0dHazaG1J3TV0rlee8Cdo2uQxVCfl0165suAJf4KGDamiZeIYnvKEd2XAE34AzMikeG1TO1t3dxQ7FOeOyhN+ALSGt+ee9mG2rsR5wg+AKafUM3pYNU/5/XhX4jzhB8Dh2Wx9mK0rcZ7wA6Q1k2bL7g6Wb95T7FCc65Mn/ACZ4bPZujLgCT9AThk1lNPTw/32nCtpnvADKJtJ8/zq7T7M1pUsT/gB1NocDLNdvG5nsUNxrleRJvzxVp4JP7slXG+ZpEujjHOgTJs0luqk/PacK1mRJfyJVJ4J280CpgAzgf/MTWpZyobXVHFBw2jmL/fzeFeaojzCn0jlmSuAe8PpqtcAK8PtlbzW5jRLN7WzbY8Ps3WlJ8qEP5HKMwWtW4pys9n6MFtXiop+0c7MbjOz04FvEFSeKZikOZLaJLVt3Voa581TThnJqGHVPOXdeleCokz44648U+i6xao8czTJ3DDblVt9mK0rOVEm/HFXngnbzZJUI2kSQeWZhRHGOqBaMyk2t3ewYosPs3WlJbJCFGbWKSlXeSYJ/DRXeQZoM7N5BJVnPgIcAnYSVp4J290HLAU6gZvMrGxGs8wIH5d9avlWmsfVFTka545QpXQ7W1parK2trdhhHPahf32ChjHD+O/PlcXNBVdhJC02s5aey4t+0a5StWbSPLd6Ox2dZdMxcTHgCR+RGU0pDhzqZvFaH2brSocnfEQuOn0sVQkx3+/HuxLiCR+RETVVXDBxtD8f70qKJ3yEsk0p/ryxne0+zNaVCE/4CGWbw9lsV20vciTOBSK7D+/g7AkjGTm0mh/9cTld3d18/Ozx1FSV/EN/roL5ET5CyYT4wZXnAPDVX73E9Fsf44ePLGNz+4EiR+biygfeDILubmPBym3MfWYtjy3bQlLiY2ePZ/bFE7mgYTSSih2iqzB9DbzxLv0gSCREa3Oa1uY067bv5e5n13Ff23p++9KbnD1hJDdc3Mhl54ynttq7+y5afoQvkr0dnfz6xY3MfWYtK7fsYezwIVxzYQOfuaiB8SOHFjs8V+b6OsJ7wheZmfHMqu387Om1/On1zSQkZk45mdnTG2mZ6N19d3y8S1+ipOD5+elNKdbv2MfPn1vHvQvf4KFXNnHW+HpmT2/k8nNP8e6+GxB+hC9B+w528uCLbzL3mbUs27yb0cOqmXVhA9ddNJEJo7y77/rnXfoyZGY8u3o7c59Zy6NLNwNw6ZSTueHiRqZNGuPdfdcn79KXIUlcfHqKi09PsWFn0N3/1aL1/P7Pb3HGyXXMvriRK86bwNAh3t13hYn0CC9pJvDvBDPe3Glmt/b4/GvAFwlmtdkKfN7M1oWfdQGvhE3fMLPLj/a3KvEI35v9B7uY99JGfvb0Wl5/azejhlVz9ftO4/qLJnLq6GHFDs+ViEHv0oeFI5YDHyWYZnoRcI2ZLc1r8xfA82a2T9JfAx80s6vDz/aY2YhC/15cEj7HzFi4Zgdzn13Lw69uxsz4yJnjmD29kfdPHuvd/ZgrRpf+cCGKMIBcIYrDCW9mj+e1fw64LsJ4Kookpk0ey7TJY3lz135+8dw6frnwDR5Zupn3jKvj2mkNTEoNp35oNfW1VdTVVlM/tMrH8sdclAnfWzGJaUdp/wXg93nvayW1EXT3bzWzBwc8wgpxyqihfH3mGXz5wxnmvRRc3f/uvFd7bVtTlTic/PW11dTVVoU7hWDHkNtB1A8NP6utfsfrYUOS3nsoYyVx0U7SdUAL8IG8xRPNbKOkycBjkl4xs1U91psDzAFoaGgYtHhLVW11kk+3nMZVU09lzba97Nh7kPYDh9h9oJP2/YdoP9BJ+4FDtO/P/Q4+27hrP+37O9l94BAdnd1H/RvJhPJ2BFXU1eTvPIIdQiIhqhIimRAJiWQCEspblhBJHfldlcy1O/I7mYBkIhG2g+Th5T3bBa8TfeyD+to59bXL6mtfpj7W6DbDcr8tONXKf39kORhGd9im24DD7/tZn3Cd7qAW2/iRtbx3wsi+/hcdVZQJX1AxiXCa6m8BHzCzwzNFmNnG8PdqSU8A5wPvSHgzuwO4A4Jz+AGOv2xJYnJ6BJOPozbHgUNd7D4QJH/74R1F/k6jxw5k/yHWbtt3eAey/1BX+I/ZReXKqafyL1ede1zrRpnwhwtRECT6LODa/AaSzgduB2aa2Za85aOBfWbWISkFTCeoPeciVludpLY6Sbqu5ri3YWZ0dRtd4VGpK3zf3W10dhvduc/D153hZ0fa5dbppqubw+1y2+zqym37yDq9x9FHfBxj+z63AwkFvRcp2NGKI++DXkfQ+5Byv3trF7xX/vse6+e3HTWsuq//9P0qdiGKHwAjgP8Nu165229nArdL6iZ4Zv/W/Kv7rrQp7KaXxPmiewcfaedcBfJCFM45T3jn4sQT3rkYqZhzeElbgXX9NEsBcSoFE6fv69/1nSaa2btuzFZMwhdCUltvFzIqVZy+r3/XwniX3rkY8YR3LkbilvB3FDuAQRan7+vftQCxOod3Lu7idoR3LtZik/CSZkpaJmmlpG8WO56oSDpN0uOSlkp6VdLNxY4papKSkl6U9H/FjiVKkkZJul/S65Jek/T+Y95GHLr0hUy3VSkkjQfGm9kLkuqAxcAnK/G75oRzI7YA9WZ2WbHjiYqkucB8M7tT0hBgmJntOpZtxOUIf3i6LTM7COSm26o4ZrbJzF4IX+8GXiOYfagiSToV+ARwZ7FjiZKkkUArcBeAmR081mSH+CR8b9NtVWwS5EhqJJg45PkihxKlHwFfB44+VU/5m0Qws/PPwtOXOyUNP9aNxCXhY0fSCOAB4Ctm1l7seKIg6TJgi5ktLnYsg6AKuAD4sZmdD+wFjvlaVFwSvqDptiqFpGqCZL/HzH5d7HgiNB24XNJagtO0D0n6RXFDiswGYIOZ5Xpr9xPsAI5JXBL+8HRb4cWOWcC8IscUCQVTB90FvGZmPyx2PFEys1vM7FQzayT4f/qYmVXkVOdm9hawXtJ7wkUfJm/K90LFYhaivqbbKnJYUZkOXA+8ImlJuOzvzex3xQvJDZC/Ae4JD1qrgc8d6wZicVvOOReIS5feOYcnvHOx4gnvXIx4wjsXI57wzsWIJ7wbVJI+WOlPtZUyT3jnYsQT3vVK0nWSFkpaIun28JnzPZL+LXzO/k+S0mHb8yQ9J+llSb8Ji4EiqUnSHyW9JOkFSaeHmx+R91z3PfKC84PGE969i6QzgauB6WZ2HtAFfAYYTlAIdArwJPDdcJW7gW+Y2TnAK3nL7wFuM7NzgYuBTeHy84GvAGcBkwlGB7pBEIuhte6YfRiYCiwKD75DgS0Ej6D+KmzzC+DX4XPao8zsyXD5XIJqwHXABDP7DYCZHYCgsiyw0Mw2hO+XAI3Agsi/lfOEd70SMNfMbnnHQuk7Pdod77jsjrzXXfi/w0HjXXrXmz8BV0o6CUDSGEkTCf69XBm2uRZYYGZvAzslZcPl1wNPhrPtbJD0yXAbNZKGDeaXcO/me1b3Lma2VNK3gUckJYBDwE0Eky5cGH62heA8H+AG4CdhQuc/xXU9cLuk74XbuGoQv4brhT8t5womaY+ZjSh2HO74eZfeuRjxI7xzMeJHeOdixBPeuRjxhHcuRjzhnYsRT3jnYsQT3rkY+X8ArrFSTZzBNgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def train_sgd(lr, batch_size, num_epochs=2):\n",
    "    train_ch7(sgd, None, {'lr': lr}, features, labels, batch_size, num_epochs)\n",
    "train_sgd(1, 1500, 6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.243556, 1.291605 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "train_sgd(0.005, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.246715, 0.133914 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPwAAAC1CAYAAAB7/JLDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAXwUlEQVR4nO3dfXRcdZ3H8fd3ZjKTZpK0M0n6QNs0LW2FQoE+QKGggihPKqigVh4WVJYjwhGfVsV1dQ/q4uo5rmdXFDmIgosLQsWtgiKgIqhA0yegtNA2tLTdtnlsmudkMt/9496EMU3TSZp5yPy+r3NyMnPn3jvfTPuZ3507936vqCrGGDcEcl2AMSZ7LPDGOMQCb4xDLPDGOMQCb4xDLPDGOCSU6wLGS2VlpdbU1OS6DGPywrp16xpVtWro9IIJfE1NDbW1tbkuw5i8ICK7hptum/TGOMQCb4xDMhp4EblIRF4Vke0i8qVhHr9ORBpEZKP/c33KY9eKyDb/59pM1mmMKzIWeBEJAncAFwOLgI+IyKJhZn1QVU/zf+72l40DXwNWAGcAXxOR2LHU88et9Vx/by3dff3HshpjJrRMjvBnANtVtU5Ve4EHgMvSXPZC4AlVbVbVFuAJ4KJjKWb/oW6e3HKA5o7eY1mNMRNaJgM/E9idcn+PP22oy0XkRRF5WERmj3LZtMWjYQALvHFarnfa/RqoUdVT8Ebxe0ezsIjcICK1IlLb0NAw4rwWeGMyG/i9wOyU+7P8aYNUtUlVe/y7dwPL0l3WX/4uVV2uqsurqg47xuDvWOCNyWzg1wILRGSuiISBVcCa1BlEZEbK3UuBLf7tx4ELRCTm76y7wJ82ZvESC7wxGTvSTlUTInIzXlCDwD2qullEbgNqVXUN8CkRuRRIAM3Adf6yzSLydbw3DYDbVLX5WOqZPKmIgFjgjdsyemitqj4GPDZk2ldTbt8K3HqEZe8B7hmvWgIBIVYSprnTAm/cleuddlkVj4ZpbrfAG3c5FfhY1EZ44zanAl8RDdtneOM0pwIfi4ZpscAbhzkV+IpomJbOXpJJ68Vv3ORU4GMlYZIKrV19uS7FmJxwKvAVpd7BN022WW8c5VTgY/7Rdi22p944yqnADxxP32TfxRtHORl4G+GNq5wMvH0Xb1zlVOCLi4KUhIO2SW+c5VTgwRvlbZPeuMq5wFdEw/a1nHGWc4G3w2uNy3Lalz5lvstFREVkuX+/RkS6UvrV3zleNcXtBBrjsIw1wEjpS/8uvK6za0Vkjaq+MmS+MuAW4Pkhq9ihqqeNd13xEgu8cVc+9KX/OvDvQHcGaxkULw3T1ddPV69dkMK4J6d96UVkKTBbVR8dZvm5IrJBRJ4WkbcO9wSjaVM9YLCZpe2pNw7K2U47EQkA3wU+N8zD+4BqVV0CfBb4uYiUD51pNG2qBwwefGPfxRsH5bIvfRlwMvAnEdkJnAmsEZHlqtqjqk0AqroO2AEsHI+iBgNvI7xxUM760qtqq6pWqmqNqtYAzwGXqmqtiFT5O/0QkXnAAqBuPIp68/DanqPMaUzhyXVf+iN5G3CbiPQBSeATx9qXfsCbgbcmGMY9Oe1LP2T6uSm3VwOrM1FTeXERwYDYCG+c5NyRdt4FKYpshDdOci7wMHC0nY3wxj1OBj5WEqbFRnjjICcDX1EapslGeOMgJwMfKwnT0mkjvHGPk4EfuCBFv12QwjjGycDHomFU4aAdbWcc42TgrXutcZXTgbdmlsY1TgfeRnjjGicDXxGNAHaNOeMeJwMfixYBWDNL4xwnAx8JBSmNhGyEN85xMvDgjfI2whvX5GWban/arf5yr4rIheNdWzwasRHeOCcv21SLyCK8DjknAccBT4rIQlUdt1az8ZIiGtrteHrjlnxtU30Z8IDf2+51YLu/vnETj0askaVxTr62qT7qsscqHi2yRpbGOfnapjrddYy6L/2AeDRCd1+Szt7EWJ/emAknL9tUp7EsMLa+9APi/nfxdtkp45K8bFPtz7dKRCIiMhevTfUL41lc3D/azgJvXJKXbar9+X4BvAIkgJvGcw892Ahv3JSXbar9+98Evpmp2myENy5y9ki7wYtKWuCNQ9IKvIjcIiLl4vmxiKwXkQsyXVwmlU8K+ReksMAbd6Q7wn9MVQ8BFwAx4BrgWxmrKgtEhFhJ2AJvnJJu4MX/fQnwM1XdnDJtwqqIWuCNW9IN/DoR+T1e4B/3j39PZq6s7IhFiyzwxinp7qX/OHAaUKeqnSISBz6asaqypCIaYcv+Q7kuw5isSXeEPwt4VVUPisjVwFeA1syVlR1x26Q3jkk38D8EOkXkVLxj33cA92WsqiyJRcO0dvWR6J/wn06MSUu6gU+oquKdtvp9Vb0D71j4Ca1i4IIUXXbZKeOGdAPfJiK34n0d96h/pltR5srKjthAu2rbrDeOSDfwHwZ68L6P34939tp3MlZVllQMXJDCAm8ckVbg/ZDfD0wWkfcA3ao68T/Dl9gIb9yS7qG1H8I7PfWDwIeA50XkikwWlg0VpTbCG7ek+z38PwOnq2o9gIhUAU8CD2eqsGyYUmIXpDBuSfczfGAg7L6mUSybtyKhIGV2QQrjkHRD+zsReVxErhOR64BHGXKe+3CO1pdeRD4hIi+JyEYRedZvT42I1IhIlz99o4jcOZo/ajRi0bBdVNI4I61NelX9JxG5HDjbn3SXqj4y0jJp9qX/uare6c9/KV5Ty4v8x3ao6mlp/yVjZEfbGZek3fFGVVcDq0ex7sG+9AAiMtCXfjDw/im3A6KAjmL94yIeDXPgUPfRZzSmAIwYeBFpY/gQCqCqWj7C4sP1ll8xzHPcBHwWCAPvSHlorohsAA4BX1HVZ0aqdazi0TBb9tkJNMYNIwZeVTN++Kx/mO4dInIl3kk51wL7gGpVbRKRZcCvROSkIVsEiMgNwA0A1dXVY3r+eDRMU0cvyaQSCEz4U/yNGVEu+9IP9QDwPgD/ElNN/u11eCfrLBy6wLH0pR8wv6qU3kSSusb2MS1vzESSs770ACKyIOXuu4Ft/vQqf6cfIjIPry99XSaKXF4TA6B2Z0smVm9MXslY4FU1AQz0pd8C/GKgL72/Rx7gZhHZLCIb8T7HX+tPfxvwoj/9YeATqtqciTrnVkapiIZZa4E3DshpX3pVveUIy432G4ExExGWzYmxbldG3k+MySsT/mi58bC8JsbOpk4a2ux68aawWeCB5TVxABvlTcGzwAMnHzeZSChgn+NNwbPAA+FQgFNnT6F2lwXeFDYLvG/5nBib97bS1TuuF6k1Jq9Y4H2n18RJJJWNuw/muhRjMsYC71ta7R2AYzvuTCGzwPsmlxTxlmlltuPOFDQLfIplNTHWv9FCfzLrZ+kakxUW+BTL58Ro607w2oG2XJdiTEZY4FOc7h+AY1/PmUJlgU8xKzaJqWURanfajjtTmCzwKUSE02vidqqsKVgW+CGWzYmx92AX+1q7cl2KMePOAj/E4Od4G+VNAcpo4Mfal95/7FZ/uVdF5MJM1pnqxBlllISD9jneFKSMBT6lL/3FwCLgI6mB9v1cVRf7/ee/jdeXHn++VcBJeH3qfzDQ8irTQsEAS6rtRBpTmDI5wg/2pVfVXrwmlZelzjBCX/rLgAf8ZpavA9v99WXFsjlxtuw7RHtPIltPaUxWZDLww/Wlnzl0JhG5SUR24I3wnxrlsjeISK2I1DY0NIxb4afXxEgqbHjDRnlTWHK+005V71DV44Ev4vWlH82yx9ymejhLqmMExHbcmcKTl33px7DsuCqNhDhxRjm1duacKTB52Zfen2+ViEREZC5eX/oXMljrYVYeX8Hzdc1s3W+XoTKFIy/70qvqZuAXeBee/B1wk6pmtRXNjefOp3xSEV9a/ZKdPWcKhqgWxn/m5cuXa21t7biu83837uWWBzby1fcs4mPnzB3XdRuTSSKyTlWXD52e8512+ezSU4/jvLdU8Z3HX2V3c2euyzHmmFngRyAifOP9iwkI/POvXqZQtoaMuyzwRzFzyiS+cNEJ/Pm1Bh7ZkLUvCozJCAt8Gq4+cw5Lq6dw229eobHdLkdlJi4LfBqCAeFbl59CR0+C2379Sq7LMWbMLPBpWjitjJvOm8+aTf/HH7YeyHU5xoyJBX4Ubjz3eBZMLeUzD27imW3jd+y+MdligR+FSCjIPdedzvTyYq695wXufqbO9tybCcUCP0qz4yWs/uRK3rVoGt94dAuff+hFuvvsenRmYrDAj0FpJMQPr1rGLecvYPX6Pay66znqD3XnuixjjsoCP0aBgPCZdy3kh1ct5bUDbbz3+8/y5CsH6Oy1phkmf4VyXcBEd/HiGdRURrnhZ7Vcf18toYBw8szJrJgXZ8XcOMtr4pQXF+W6TGMAO3lm3HT19vPCzmZeeL2J5+ua2bTnIH39SkDgfafN5N8+sJjioqy05TPmiCfP2Ag/TiaFg7x9YRVvX+h13unq7WfDGy08seUAP/nLTnY1d3LXNcuoKI3kuFLjsly3qf6siLwiIi+KyFMiMiflsX6/ffVGEVkzdNl8NykcZOX8Sr723pP4wVVLeXlvK+//wV/Z0dA+pvW1dPTaV4DmmGVsk95vK/0a8C68JpRrgY+o6isp85wHPK+qnSJyI3Cuqn7Yf6xdVUvTfb5cb9IfzYY3WvjH+2rp61fuvHoZZx1fMeL8ff1Jane28IetB3hqaz11DR2cNa+C73zwFGbFSrJUtZmojrRJn8nAnwX8q6pe6N+/FUBVbz/C/EuA76vq2f79ggo8wO7mTj7607Xsaurg9g+cwhXLZpHoT9Lc0Ut9Ww8NbT3sa+3mrzsaefq1Btq6E4SDAVbMi3PScZP52d92IiJ89T2L+ODyWYjIEZ+rN5EkHLIvYVyVi8/ww7WaXjHC/B8Hfptyv1hEaoEE8C1V/dW4V5hls+MlrL5xJZ+8fx2ff2gTtz+2hebOXoa+51aWRrj45Om844RpnLOgktKI98901YpqPv/QJr6w+kUe37yf2y9fzNSy4sHl9rR08thL+3j0pf1s2n2Qk2eWc8Gi6Vxw0jTeMq3ssDeI+rZunt3WyLPbGtne0E51vIT5U0uZP7WUBVPLqKksIRKyHY2FJJMj/BXARap6vX//GmCFqt48zLxX4/W/e7uq9vjTZqrqXhGZB/wBOF9VdwxZ7gbgBoDq6uplu3btysjfMt76+pP84I872H+om6qyiPdT6v2eWhZh5pRJBALDj97JpPKTv+7k27/bSkk4yJcvOZGWzt7BkAOcPLOcs+ZVsP6Ng6x/owVVmB2fxAWLprO0OsbG3S08s62RrfvbAIiVFHHijHJ2t3Syp6Vr8A0oGBAWTC3lvacex/uWzGTmlEnZeHlGpa8/yct7WwkGhKllxVSWhgkFD9+yUVXaehI0tPXQ2tVHeXERVaURyieFRtxSyieJ/iQv7m0lHAxw8szJI86bt5v0IvJO4L/wwl5/hHX9FPiNqj58pOebCJv042l7fRuf+8UmNu1pBWDxzMlcsngGlyyezpyK6OB89W3dPLWlnt9v3s9ftjfR258kHAywvCbGOQsqeduCKhbNKB98g+nq7aeusZ3t9e3sqG/nubpmXvCvs3fmvDgfWDKLixdPp2wcjy1IJpXmzl4a272PNY3tPZRGiphXFaU6XkLRkAC3dvXxp1freWpLPX96tZ5D3W8e7CQCFdEwVWXFVETDtPUkaGzroaG9h95E8rDnDgcDVJaGqSyLMK28mNNrYpwzv4oTppcd8U13OIn+JAe7+mjp6KWtJ4GqoupdSimZVBQoCgqlkSLKikOUFYeIhkMjPoeqUtfYwV+2N/LMtkae29FEW0+Cd58ygzuuXDpiPbkIfAhvp935eD3l1wJX+h1pB+ZZAjyMtyWwLWV6DOhU1R4RqQT+BlyWusNvKNcCD95/sj9va2B+VRnVFUffkdfek+C1A22cOL2cSeH0N9V3N3fyyIa9PLJhL683dhAJeW8YxaEgwYAQCgoBEUIBQUToTyr9qiSTSn9SSSokkkn6+pP0JZSe/iR9Ce9+a1cfTR29R+wMHAoI1fESP/xRtuw7xNqdzSSSSkU0zHknTOW8t0ylKCg0tPdQf6hncH9IU0cPpZHQ4BZUZWmEyrIwUyaFOdTdR4P/RtDY5r3Z7G7upK6xA/DeNFbOr+Sc+RWcMmsKLZ29HDjUzf7WHv93Nw3tPTR39NLc0UtrV1/ar+cAESgNhyiJBImEghQXBQZ/h0MB6ho62NfqHbI9KzaJty6o5Oz5law8vpJ4NHyUdWc58P6TXgJ8DwgC96jqN0XkNqBWVdeIyJPAYmCfv8gbqnqpiKwEfgQk8b46/J6q/nik53Ix8NmmqmzYfZBH1u/lxb2t9CeTJPqVpCqJwXArQRECASEoQjDgvxkEhXAwQFEwQFEoQDgoFAUD3qb1wMca/6ciGqa1q4+6hg7qGtupa+hgR0M7O5s6qako4fwTp/HOE6dx2uwpBEcxCqdjf2s3z25v5C/bG3l2eyMNbYd3OCqLhJg2uZipZREqSiPES4qIRcPEo2FiJWFKi0MERBDwfgsI0JdU2rr7aO9O0NadoK27j7aeBJ09/fQk+unuSw7+7k70M728mHMWVHLO/Mq/22pLR04Cn00W+MKnqln9vK2qbKtv59X9bVSUhplWXsz08mKikfw/Xs2OtDMTXrZ3rokIC6eVsXBaWVafN5Psi1pjHGKBN8YhFnhjHGKBN8YhBbOXXkQagKMdalcJNGahnPE00Wq2ejMvnZrnqGrV0IkFE/h0iEjtcF9V5LOJVrPVm3nHUrNt0hvjEAu8MQ5xLfB35bqAMZhoNVu9mTfmmp36DG+M61wb4Y1xWkEGPo3mmRERedB//HkRqclBman1HK3e60SkIaWp5/W5qDOlnntEpF5EXj7C4yIi/+n/PS+KyMgnb2dBGjWfKyKtKa/xV7Nd45B6ZovIH/0mr5tF5JZh5hn96+ydqF84P3in4u4A5gFhYBOwaMg8nwTu9G+vAh7M83qvw+v3l/PX16/nbcBS4OUjPH4JXrsyAc7Ea1Sa7zWfi9dkJeevr1/PDGCpf7sMr7fE0P8Xo36dC3GEPwPYrqp1qtoLPABcNmSey4B7/dsPA+dL7vocpVNvXlHVPwPNI8xyGXCfep4DpojIjOxUN7w0as4rqrpPVdf7t9uALXh9IlON+nUuxMAP1zxz6As1OI+qJoBWYOS+0ZmTTr0Al/ubbQ+LyOzslDZm6f5N+eYsEdkkIr8VkZNyXcwA/yPnEuD5IQ+N+nUuxMAXol8DNap6CvAEb26dmPGzHu9w1FPxeiz+KrfleESkFFgNfFpVDx3r+gox8HuB1BFwlj9t2Hn83nuTgaasVHe4o9arqk3qd/MF7gaWZam2sUrn3yCvqOohVW33bz8GFPn9FHNGRIrwwn6/qv5ymFlG/ToXYuDXAgtEZK6IhPF2yg29VNUa4Fr/9hXAH9TfC5IDR613yOeyS/E+z+WzNcA/+HuRzwRaVXXf0RbKJRGZPrAfR0TOwMtGrgYB/Fp+DGxR1e8eYbZRv84F1+JKVRMicjPwOG82z9yc2jwT74X8mYhsx9uRsyrP6/2UiFyKd1GOZry99jkjIv+Dt1e7UkT2AF8DigBU9U7gMbw9yNuBTuCjuan0TWnUfAVwo4gkgC5gVQ4HAYCzgWuAl0Rkoz/ty0A1jP11tiPtjHFIIW7SG2OOwAJvjEMs8MY4xAJvjEMs8MY4xAJvsso/K+03ua7DVRZ4YxxigTfDEpGrReQF/9zwH4lIUETaReQ//POznxKRKn/e00TkOf/knkfEu9w3IjJfRJ70T0hZLyLH+6sv9U8C2ioi9+fwTEXnWODNYUTkRODDwNmqehrQD1wFRPGO/jsJeBrvaDWA+4Av+if3vJQy/X7gDv+ElJW8eVnwJcCngUV4fQDOzvCfZHwFd2itGRfn452gs9YffCcB9UASeNCf57+BX4rIZGCKqj7tT78XeEhEyoCZqvoIgKp2w+AVYF9Q1T3+/Y1ADfBsxv8qY4E3wxLgXlW99e8mivzLkPnGelx2T8rtfuz/YdbYJr0ZzlPAFSIyFUBE4iIyB+//yxX+PFcCz6pqK9AiIm/1p18DPO13adkjIu/z1xERkZJs/hHmcPbOag6jqq+IyFeA34tIAOgDbgI6gDP8x+rxPueDd6rxnX6g63jzrK1rgB/5Z/71AR/M4p9hhmFny5m0iUi7qpbmug4zdrZJb4xDbIQ3xiE2whvjEAu8MQ6xwBvjEAu8MQ6xwBvjEAu8MQ75f0wvNdAaqVFmAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "train_sgd(0.05, 10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch.nn as nn\n",
    "def train_pytorch_ch7(optimizer_fn, optimizer_hyperparams, features, labels, batch_size=10, num_epochs=2):\n",
    "    # 初始化模型\n",
    "    net = nn.Sequential(\n",
    "        nn.Linear(features.shape[-1], 1)\n",
    "    )\n",
    "    loss = nn.MSELoss()\n",
    "    optimizer = optimizer_fn(net.parameters(), **optimizer_hyperparams)\n",
    "    def eval_loss():\n",
    "        return loss(net(features).view(-1), labels).item() / 2\n",
    "    ls = [eval_loss()]\n",
    "    data_iter = torch.utils.data.DataLoader(\n",
    "        torch.utils.data.TensorDataset(features, labels), batch_size, shuffle=True\n",
    "    )\n",
    "    for _ in range(num_epochs):\n",
    "        start = time.time()\n",
    "        for batch_i, (X, y) in enumerate(data_iter):\n",
    "            # 除以2是为了和train_ch7保持一致, 因为squared_loss中除了2\n",
    "            l = loss(net(X).view(-1), y) / 2\n",
    "            # 梯度清零\n",
    "            optimizer.zero_grad()\n",
    "            l.backward()\n",
    "            optimizer.step()\n",
    "            if (batch_i + 1) * batch_size % 100 == 0:\n",
    "                ls.append(eval_loss())\n",
    "    # 打印结果和作图\n",
    "    print('loss: %f, %f sec per epoch' % (ls[-1], time.time()-start))\n",
    "    d2l.set_figsize()\n",
    "    d2l.plt.plot(np.linspace(0, num_epochs, len(ls)), ls)\n",
    "    d2l.plt.xlabel('epoch')\n",
    "    d2l.plt.ylabel('loss')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.243574, 0.116980 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from torch import optim\n",
    "train_pytorch_ch7(optim.SGD, {'lr': 0.05}, features, labels, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6.4 动量法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 20, x1 -0.943467, x2 -0.000073\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import d2lzh as d2l\n",
    "# 学习率\n",
    "eta = 0.4\n",
    "def f_2d(x1, x2):\n",
    "    return 0.1 * x1 ** 2 + 2 * x2 ** 2\n",
    "def gd_2d(x1, x2, s1, s2):\n",
    "    return (x1-eta*0.2*x1, x2-eta*4*x2, 0, 0)\n",
    "d2l.show_trace_2d(f_2d, d2l.train_2d(gd_2d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 20, x1 -0.387814, x2 -1673.365109\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "eta = 0.6\n",
    "d2l.show_trace_2d(f_2d, d2l.train_2d(gd_2d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 20, x1 -0.062843, x2 0.001202\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def momentum_2d(x1, x2, v1, v2):\n",
    "    v1 = gamma * v1 + eta * 0.2 * x1\n",
    "    v2 = gamma * v2 + eta * 4 * x2\n",
    "    return x1-v1, x2-v2, v1, v2\n",
    "eta, gamma = 0.4, 0.5\n",
    "d2l.show_trace_2d(f_2d, d2l.train_2d(momentum_2d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 20, x1 0.007188, x2 0.002553\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "eta = 0.6\n",
    "d2l.show_trace_2d(f_2d, d2l.train_2d(momentum_2d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "features, labels = d2l.get_data_ch7()\n",
    "# 初始化动量相关变量\n",
    "def init_momentum_states():\n",
    "    v_w = torch.zeros((features.shape[1], 1), dtype=torch.float32)\n",
    "    v_b = torch.zeros(1, dtype=torch.float32)\n",
    "    return (v_w, v_b)\n",
    "def sgd_momentum(params, states, hyperparams):\n",
    "    for p, v in zip(params, states):\n",
    "        v.data = hyperparams['momentum']*v.data + hyperparams['lr']*p.grad.data\n",
    "        p.data -= v.data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.243169, 0.260499 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.train_ch7(sgd_momentum, init_momentum_states(), {'lr': 0.02, 'momentum': 0.5}, features, labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.270185, 0.170542 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.train_ch7(sgd_momentum, init_momentum_states(), {'lr': 0.02, 'momentum': 0.9}, features, labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.245188, 0.202992 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.train_ch7(sgd_momentum, init_momentum_states(), {'lr': 0.004, 'momentum': 0.9}, features, labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.244982, 0.120022 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.train_pytorch_ch7(torch.optim.SGD, {'lr': 0.004, 'momentum': 0.9}, features, labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6.5 AdaGrad算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 20, x1 -2.382563, x2 -0.158591\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import math\n",
    "def adagrad_2d(x1, x2, s1, s2):\n",
    "    # 前两项为自变量梯度\n",
    "    g1, g2, eps = 0.2*x1, 4*x2, 1e-6\n",
    "    s1 += g1**2\n",
    "    s2 += g2**2\n",
    "    x1 -= eta / math.sqrt(s1+eps)*g1\n",
    "    x2 -= eta / math.sqrt(s2+eps)*g2\n",
    "    return x1, x2, s1, s2\n",
    "def f_2d(x1, x2):\n",
    "    return 0.1*x1**2+2*x2**2\n",
    "eta = 0.4\n",
    "d2l.show_trace_2d(f_2d, d2l.train_2d(adagrad_2d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 20, x1 -0.002295, x2 -0.000000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "eta = 2\n",
    "d2l.show_trace_2d(f_2d, d2l.train_2d(adagrad_2d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "features, labels = d2l.get_data_ch7()\n",
    "def init_adagrad_states():\n",
    "    s_w = torch.zeros((features.shape[1], 1), dtype=torch.float32)\n",
    "    s_b = torch.zeros(1, dtype=torch.float32)\n",
    "    return (s_w, s_b)\n",
    "def adagrad(params, states, hyperparams):\n",
    "    eps = 1e-6\n",
    "    for p, s in zip(params, states):\n",
    "        s.data += (p.grad.data**2)\n",
    "        p.data -= hyperparams['lr'] * p.grad.data / torch.sqrt(s+eps)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.242391, 0.163231 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.train_ch7(adagrad, init_adagrad_states(), {'lr': 0.1}, features, labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.242369, 0.153083 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.train_pytorch_ch7(torch.optim.Adagrad, {'lr': 0.1}, features, labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6.6 RMSProp算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 20, x1 -0.010599, x2 0.000000\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPUAAAC1CAYAAACH6bkJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAp6ElEQVR4nO2dd3xkV3n3v+fe6UWjLu2qrLbvuqwNuKxxZ4EYTGJKcLCxwdjEIYFA8oEAhmAI5QVDQskLIXF4IcTYGFNsMLjggrEx2N512eKyvUi76mU0vZ73j3OnqGt3JY1mdL4fj2+ZOzNHWv3mnHvO73keIaVEo9FUDkapG6DRaOYWLWqNpsLQotZoKgwtao2mwtCi1mgqDC1qjabCsJW6AcdDfX297OjoKHUzToh0RhJOpAgnMoQTaVKZLAA2Q9Bc5aLG6yhxCzXlxLPPPjsgpWyY7LmyEnVHRwfbtm0rdTNmRSSR5umDgzy+Z4A/7h9gT28YgGaPnfNW1fHa1XWct7qO1Q0+hBAlbq2m3BBCHJ7qubIS9WJGSsnu3hCPvNzHE3v7efbwMKmMxGkzOGdlLe94dSvnr6nnlGVVGIYWsWb+0KI+CaSUbO8Kcv+ubh7c1cOhwSgAG5dVcf0FK7lobQOvWVGDy26WuKWapYQW9XGSzUqe7xzhvp3dPLCrh6MjMWyG4LzVdfz1Rat4/cYmmqpcpW6mZgmjRT0LpFRC/s2Obu7b2U13MI7DNLhwbT3/+IZ1vGFjEwGPvdTN1GgALepp6QnGuWtbJ3dt66RrOIbDNLhoXQMfv2w9WzY2UeXSQtYsPrSox5HNSn6/t587nj7Co6/0kclKLlhTzz++fh1vOFULWbP40aK2GAwnuGtbF3c8c5jOoRj1Pgc3XrSKd53dxoo6b6mbp9HMmiUv6p1dQb7/5EF+s6ObZCbLeavq+MRlG3jjKc04bNpwpyk/lqyod3YF+ebDe3jklT78ThtXn9vONZvbWdPoL3XTNJqTYsmJetdRJeaHX+4j4LbzsTeu472v7cCv75U1FcKSEfWe3hDfeGgP9+/qocpl46NvWMd152sxayqPihd1MJbiK/e/zJ1bO/E6bHxky1puuHClnsXWVCwVLeoHdnXzmV++yGA4wfXnr+RDl67R0VCaiqciRd0XinPzPS/ywIs9nLq8ih9cdzantQRK3SyNZkGoOFHf8/xRPvurF4mlMnzisg389YUrsZl6aUqzdKgYUWeyki/f9zLf+8NBzlpRwy1/uYnVDb5SN0ujWXAqQtTRZJoP//gFHn65l+te28E/X75R986aJUvZi7p3NM4NP9zKS8dG+dyfn8J1568sdZM0mpJS1qLuC8V5+3/8keFoku+99yxet6Gp1E3SaEpO2Yo6kc7wgdueZSiS5M4bN3NGW3Wpm6TRLArKUtRSSj599y6eOzLCd65+tRa0RlNEWc4m/eDJQ/zs2S4+vGUtl29aVurmaDSLirIT9UA4wVcffIUtGxr5hy1rS90cjWbRUXai/n9/OEgineVTl2/UqXY1mkkoK1FnspLb/nSYy09fpo0lGs0UlNVE2VAkiUik+eCla0rdFI1m0VJSUQshLgO+BZjA96SUX5nu+lgqwyl1HjYuq1qQ9mkWGTvugkc+D8EuCLTClpth05UzPz/ZeZj+nLtGHceGi/aHQJggM4AA5MQ2rrwY3vur+foNzAoh5SQNW4gPFsIE9gBvALqArcBVUsqXpnpNVdt6eeUXb+d77z1rgVqpOWFmEuDxXr/jLrj3w5CKFc7Z3fDn/14Q7mTPn3E1bL9j7HnDDkJAJjn9uRNlAYQthHhWSjmpEErZU58D7JNSHgAQQtwJXAFMKepkOsuaRn0vvegZL7BgpzqGicKWEp6/He77KKTjhet/+SHo2QXtm5XQ7v/EWGGCOr7vnyDcC49/bfLnt32fCT1qNjWxzZOdO1EO/n7u3usEKKWoW4DOouMu4NzxFwkhbgRuBHA0r6FaV8JY/Dzy+ckFdu9HYNcv1JA2PqK2sRHIJCa+RyYBf/yWekxHfAR++8/TXFCakWgpWfQTZVLKW4FbAbwt6+TB/kiJW7TEmG5YLKU63/+KevS9Av0vq552MlJRGLXuV+vXqa27Gp6cSrgCbnwMTAf86G0Q6pl4SVULfPBp+M65MHp0krfI3QMvHUop6qNAW9Fxq3VuSpw2k3394XltlKaIyYbR9/wdbPsfyMShfzcki/49vA3QsAEcvrHncwTa4AN/mHh+1y8m/yIItMLyM9X+G74w+T3z6z8HTr/aLqZ76hJSSlFvBdYKIVaixPwu4OrpXuC0G+zpCRFPZXR52IXgoZsnDqOzKej8E3RcAGderUSce3jr1DVTTVrlZpjHs+Xmma/PjQ6mGjVM93z7Zj37vWAfLsSbgW+ilrS+L6X80nTXbzj9TBm//Et88a2ncc3mFQvRxKVHdAheugd2/BSO/HGKiwR8bmT695nr2W/NGKab/S6pqI+Xs846S7Zd/y36Qwl+97FLsOvsJnNDKga774edP4W9D6neuH4dhHohEZx4faAN/nHXwrdTk2c6UZedKj506Rq6hmPc8/y0t9+amchmYP+jcPffwtfWws/eB8eeh3P/Bv7mcfjgM3D5v6phcDHTDaM1i4JFP/s9ntdtaOSM1gBf+PVLnNVRy8p6XZFySiYb0tatUT3yrp+r9V1nFZxyhRrqdlwARtFcxUz3sZpFSdkNv7dt20bnUJS/+PYfqPU6uPuD5+tqG5Mx2WRVbnLHdMDaN8Lp74R1l4HdVapWak6Qihp+A7TVeviPd7+Gw4NRPvLj58lky+eLacGYzACCVDO5H9sD77odTn2rFnQFUpaiBjhvdR2f/YtT+d3ufj7+sx0k09lSN2nxkElNbQCJjRSWaDQVSdndUxdz7eYVDIYTfPPhvXQHY3z33a8hsNRtpD074Z6/nfr5QOvCtUVTEsq2p87xD69fx9evPIOth4Z4+3ef5MhgtNRNKg2ZFDz2Fbj1ErUUtfnv9Mz1EqXsRQ3w9le3ctsN5zIQTvLW/3iSJ/cNlLpJC0vPTvjvS+GxL8Opb1Ne6Mu+rMISA22AUNtcmKKmoinL2e+pONAf5v3/u40D/RGuOqedm968obJnxjMpeOLfVNihuxbe8g3Y+JZSt0qzAFTc7PdUrGrw8Zu/v5AbL1rFT7Ye4Y1ff5yHX+otdbPmh8l6Zy1oDRUmagC3w+RTb97IL/7ufAJuO+//32188I7n6A9NErNbjmRS8NgthXvnv7od3vE98NSWumWaRUJFDb/Hk0xnufXx/fz7I/tw2gxuuHAlN1ywEn+5DslzM9s9O5Vx5E1f1WJeolRUQMfxiDrH/v4wX33gFR58sZdqj50bL1rFe8/rwOsskxW9TAqe+Do8/lV976wBtKjz7OwK8vWHdvO73f3Ueh3ceNEq3nPeCjyORSxu3TtrJkGLehzPHRnmmw/v5fE9/dR5HVx/wUredXYbdT7nHLRyjtC9s2YatKin4NnDw3zrESVuh2nw5tObuWbzCl6zogYhSljSR/fOmhnQop6BfX0hfvTUEX7+bBehRJoNzX7evXkFbz1z+cJOquneWTNLtKhnSSSR5lfbj/Gjpw7z4rFR3HaTvzhjOVed284ZrYG5772L4519jWA4YLRT986aGdGiPk6klGzvCvLjp4/wq+3HiKUyrKr3cvmmZbxl03LWN/tP/kMmjXdGebYv+/LJv7+motGiPglC8RT3bu/m1zuO8dSBQbIS1jT6ePNpzbx50zLWN/lPrAf/xmlTpMXV+b80M6NFPUf0heI8uKuH3+zs5pmDQ2QlrKz3ctlpzbzptGZObzmOIfrnqpm8esQsMnVqljyLtZZW2dHod3HteR1ce14H/aEED77Yw4Mv9nDr4wf47mP7WR5w8YZTmrhkfSPnrqqdev1bSrB7IDVJtREd76w5SbSoT5AGv5NrNq/gms0rGIkmeeilXh58sZc7t3bywz8dxmEavGZFDResrefCtfWcujyAaVi9+ONfU4I2bJBNF95Uxztr5gA9/J5j4qkMWw8N8Ye9Azy+d4CXu0cBCLjtvHZ1Hde4n+T8nZ9BnvEuxOotOlOn5oTQw+8FxGU3uXBtAxeubeAmoD+U4I/7B3hy3wCJ3Y9yTvILPJE9jZteehtnJ5vZfMF9bF5VR3utp7SGF03FUBJRCyHeCXwO2AicI6Vc3N3vSdDgd3LFmS1c0TyM3PNvpOrX0fOqWznjSIIn9vZzt1WUoN7n4My2Gl7VXs2r2qvZ1FqNr1wCTjSLilL91ewC3g78V4k+f2EJHoXb34lw+nG85+e8M9DCO1Hr4fv7wzx1YIjnjgzzwpERHn5ZJXUQAtY2+tjUWs0ZbdWc0RpgQ3MVDlvFhcBr5phpRS2EqAIapJT7x53fJKXccaIfKqV82XqfE32L8iE+CndcCYkQXH8/BFryTwkhWNPoZ02jP1/wbySa5IXOEbZ3Bnmhc5hHX+njZ892AeAwDdY3+zm9NcDpLQFOWx5gXbMPp01XANUUmFLUQogrURUp+4QQduA6KeVW6+n/AV49760rdzIpuOs9qiD71XdB8+kzvqTa4+CS9Y1csr4RUL1513CMHV1BdhwdYdfRIPduP8YdTx8BwG4K1jb6OWV5Feub/Kxt8rGuyc+ygGtpfGlqJjBdT/0p4DVSym4hxDnAbUKIm6SUd6Pqt0yLEOJhoHmSpz4tpfzlbBsohLgRuBGgvb19ti8rPVLCvR+BA7+DK74Da7ac0NsIIWir9dBW6+HyTcsAyGYlncNRdh0dZefRIC91j/LY7v58jw7gc9pY3ehjTYOPtU1qu7rRR1uNG5uuFlrRTCdqU0rZDSClfEYIcSnwayFEG5NbocYgpXz9XDRQSnkrcCuoJa25eM8F4fe3wAu3w8WfhFddM6dvbRiCFXVeVtR580IHGIok2dMbYl9fmL29Ifb2hXlibz8/f64gdrupXruy3suqerXtsLaNfqfu3SuA6UQdEkKszt1PWz32JcA9wKnz37Qy5vnbVZbPM98Nl3xywT621utg86o6Nq+qG3M+GEuxvz/Mgf4I+/vD7O8Lc2gwwu9395PMFMoVeRwm7bUeVtR56Kjz0lbrod0aJSwLuHDZ9b17OTCl+UQIcQYQBexSypeKztuBd0kpbzvhDxXibcD/BRqAEeAFKeWfzfS6cjCfsP9RuP2d0HEhvPunYC7eJIeZrOTYSIyDAxEODUY4OBDhyGCUw0NRjgxFJ9Qnq/c5aal2sSzgpjngYnm1i6YqF81VLpoDal8Lf2E4qYAOIcQu4Dbgq4DL2p4lpTxvrhs6E4te1D074ftvgpoV8L77wVVV6hadMNmspC+U4PBghM7hGMdGYnQHY3QNx+gJxukOxgkn0hNeV+2x0+R30VjlpMHnpCG39attvd9Jvc9JtduOYeih/olyso6yc4FbgD8CfuB24Py5a16FEDwKt18JTr+a6S5jQYO6b28OqB743CmuGY2n6A3G6RlVIu8bjdM7mqBnNE5/KMGB/gj9ocSYIX4O0xDUeOzUeh3Ueh3UeZ3UeO3UeBxUexzUeOxUe+wE3A4Cbnv+odfpZ2Y2ok4BMcCN6qkPSil13dhi4kE15E6GVQ9dtBZdyVS57FS57KxtmjpphJSS0Via/nCC/lCCwUiCgVCCgXCSwUiSoUiCoUiS3b0hhiNJhqNJpis37rQZVLnt+F02/C47VS4bPqcNr9OG12Hicdrw2E3cDhOPw4bbYeC2m7ish9Nm5LdOu4nDNHDYDBymgd0UmIZY8MlCKSXJTJZURpJKZ0lmsiRSWRLpDIl0lniqsI2lMsSSmWnfbzai3gr8EjgbqAf+UwjxDinlO0/+xzk+dveE+PsfP8/mVbWcu7KO1Q3e0s/WppNqLXpgN7z7Z9B8Wmnbs8gQQhDw2Al47Kxp9M14fTYrGY2nGImmGImlGIkmCcZSjMZSahtPMxpLMRpPEYqnCSfS9ATjRJMZwok00WSaVObkFknspsBuGphGYWuKnODVKEMAhhD5xd3cX6G0/idRYs1KNXeRlTK/TWcl6YwklcmSzqrzc8lsRH1DkTe7G7hCCHHtnLZilngcJk8fGOTe7ccANXFz7spazllZy9kdtWxo9i/sfVp+LfoxeOt3YfWlC/fZFYphCKqtIfiJkspkiSZVj5bv3VJqP5FSPV6+N8xkSaazpKxtOpMllVU9Zk5w6WyWTFaSyUJWyrxYs9Z8VE7IxQIXQmBYmjeKvhRMQ2AzBKZhYDMFdlNgM8aOFhw2NZJw2Iz8yCI3uvA41H77LVP//GUXerl161YODkR45uAQTx8c4ukDgxwLxgHwu2yc3VHLWR01nN1Ry+ktgfmdjf3dl+H3X4FLPgWXfGL+PkejGUdFhV4KIVjV4GNVg493naMcZl3DUZ45OMQzB4fYemiIR1/pA8BmCDYs83NmWzVnttVwZluAVfW+uenNn7tNCfrMa+Dij5/8+2k0c0TZ9dSzWdIaDCd49vAwL3SO8ELnCDu6gvnlF5/TxuktATa1BtjUWs2m1gCtNe7juzff97Ca6V550aJfi9ZUJks+8WAmKznQH2Z7V5DtnSNs7xrhle5Qfqml2mNXUU9W5NPpLQHaaqcQevcO+MGboGYlvO++sl+60pQnS17Uk5FIZ9jTE2Z7l4p82nk0yO6eEGlrJrLKZeOU5VVsXFbFxuYq1jf7We8O4vrhn4Ew4P0PQ9XyOWmLRnO8VNQ99VzhtJkqLrk1kD+XE/pOS+QvHQty5zOdxFIZ/ET5qeNfaDWC/Fvrt/A9FWJd0zHWNfnpqPfomGbNomHJinoyJhN6Nis50j+C7+dXUdN/jG8vv4UnRps4+Nj+/PqiaQg66jysbVTxzGsa1WN1g097oTULjhb1DBgCOp78JPT9Cd76n3zkzKv4CKpXP9AfYU9viL29Yfb0htjTG+K3L/XkHVFCQEu1Oy/w1Q0+VjXoMEfN/KJFPRO/+z+w40649NNw5lX5006bqe63l42dKEukMxwciLCvL5x/HOiP8NSBQeKpgrvWbS+EOa6o89Be52WFFerYUuPGrhMZaE4QLerpeO5/VVnZV10LF/3TrF7itJlsaK5iQ/NYsWezkmPBGAf6IxwejHBwIMqRoQgHBiI8tqd/TJijIWBZwE1brZu2Gg+tNR7aat201nhorXHTVOUqFAbQaMahRT0V+x6Ge/8BVm9RdaJPcqhsGMISpQcVRl4gm5X0huL5WOYuK565czjG7/f00xdKjLneZgiWVbtoqXazvNpNq7VdVu2mpdpFc8Ct0wsvYfS//GR0b4e73gtNp8CVP5x3c4lhCJYF3CwLuDl3XNYSUFU/jo7EODqs4pk7h6Mcs46f2j9Iz2h8QmST32VjWUAJvLnKSaPfRVOVkwYr1rnRimvWE3mVhxb1eEY6lVvMVQ1X/1TFR5cYl93MT7RNRjqTpTeU4NhILplBnO6RGMeCcXpH4+zuGaU/lJg0pLHKZaO+KIFBg89JnddBvV9t63wq1rnW58DvtOnJvTJAi7qY2IiKi07F4PoHoGrZjC9ZDNhMg5ZqNy3V7imvyWQlg5EEfaMJ+kJxBkJJ+kIqmcFAOEl/KMFLx0YZCCcIxSdmNAEVkljrdVDjUYkNarwqmcFUiQ3Uvl1P+i0wWtQ50kn4yTUwuA+u+bkaelcQpiFo9Lto9LuAwLTXxlMZlcAgnGQwkmAwnGQoUpzUIMVwNMnLx0YZjiYZiaWYzpjocZhUuZTA/S5bUZIDlejA77LhtxId+JxFSQ+cKtGBx6GSHjhMQ48UZkFZiTpuxcTO+X2glPCrD8GhJ+Btt8Kqi+f2/csMl92csecvZnxig+FoMp/UYCSayic1CMZUYoO+UJz9/WlC8TSheGrWSQ1MQ+C2spq47aaV0URlMHHZTVxjspoYOEwzH5Oci1d22Azspopldlhbm2FgM0R+3zDAZhiYhkqEYBoCQ6gECWO2TD5/KvNJEkAiyebjsCFTlCwhk5VkszIft53KqLjtQjx3lqSVDSUX7520ttNRVqLe2xfmlJsfoKPey8bmKtY1+Vnf7GdDs5+2Ws+JL/M8+kXY8RN43T/DGX81t41eApxMYgMpJYl0llA8TSSRzmcziaXSRBIZIom0SniQUvu5ZAdRKwFCPJUllsoQjKXos55LprP59D+5NEGVghCq/NJ0lJWo22s9/O2la3ilJ8SuY0Hu29WdH/a57AZrGlXJmXVNftZa+y3V7unjp5/9H3jiX+HV74ELP7YgP4emgBAin9mjwe+cl8/IZnM5wJTAc5lOVFohdU71kNl8z5nOSDJS9aSZrESietustS+LMp/AmMQn1s8FgkKvbgj1s47v/XMjBHPcaCGXUslmCpymid1mHVs51MSXpvmdlnOUVjSZZk9vmD09IXZbNs09vSF6Rwvrum67adk0vZZNs2DVdB16FO74K5WG6Ko7dVy0pmyo2Cgtj8NmZTWpHnM+GE2xty/Ent4we/uUN/uZg0Pc88Kx/DWnioP81PkF+uwruc39cZb/qYuV9YXKFHrGVlOulLWopyLgsXNWRy1nddSOOR9Npjk4EKH78B7Oe/TvicsA/+K7mWd3jjC6dSB/nWkIWmvcrKjz0lHnUXWrLJ92W61HGzY0i5qKFPVUeBw2Tq2RnHr3h8BI473hN/ygcSNSSoajKQ4OhDk4ELW82RGODEW5+8jwhHXb5ioX7bUe2us8tNV4aK9THu2WGjeNfu3L1pSWkohaCPE14M+BJLAfeJ+UcmTePzidsNai98O1v4DGjbn2WJUiannNirG9e07whweVyA8PKl/2kaEof9g7QM9ofMz1433Zue1yy5e9LODGq33ZmnmkVH9dDwE3SSnTQohbgJuA+cmxu+MueOTzEOwCuxtSUXj7f6ukgbOgIHgHr2qvmfB8PJWhazhG13A0788+Ogtf9vKAm2XVLuXPrnLTHHBaPm1VcK7KrS2ZmhOjJKKWUv626PAp4C/n5YN23AX3fljZPkEJ2pjbGW6XNbs+VfWJVCZL3xS+7J5gnF1HlTVz4vsaNFW5Cg+/0wrEcNFo7Tf4tPg1E1kM48DrgZ/Myzs/8vmCoHNkU+r8pivn5SPHY5+FLzuRztBnFZYrFJqL0zOaoHc0zs6uER4eTRBLTayh5LAZRcEYKviizuegzgrMyBeg8ynPtp7kq3zmTdRCiIeB5kme+rSU8pfWNZ8G0qhKmlO9z43AjQDt7e3H14hg1/GdLxFOm0mbVdx9KqSUhBLpfEBGfygx9hFOcHQkzvauIMORZD4r6ni8DpMaS+g1+SAMB9X5wAzruCggw++y68m/MmLeRC2lfP10zwshrgPeAmyR0zhgpJS3AreCMp8cVyMCrRDsnPx8mSGEyFeZnKnQXK7S5IBVUXLQCswYiaYYDKvKksPRJMORJAcHIgxHk1NGZqnPVkUQcuVkq1x2qtw2a2sfE5ihqlDa8VnVKKtcKjjD4zD1bcICUarZ78uAjwMXSymj8/ZBW24ee08NarJsy83z9pGLgeJKk6sbZr4eVEz2iBWAEYwlGY6oAIxgTAVpjI6pPJni0EDUCtBIEZmhtKpqE3gdKvJKbZXQc1tPLkjDUTh25YM2TNwOA5fNxDmhHK2B0wrccNgMPaKgdPfU3wacwEPWt/dTUsoPzPSio8MxvvO7fays99JR56Wj3oPHMc2PkLtvzs1+B1qVoBfofrqcsJkG9T6VDeV4yWQlIau0bC7yKpJM548jCfUIJzJEkypgIxeo0R9KEEmmiSVVkMbJlqJV5WfFmIgsu2mMKU9rMw3sRT7rXCXK4uqUat/ybRu5CpYCwwAsT/dsorRARWflvOK5apm5SK3cfiYLmWxxpU3lS09nJalM8b7yrU9HWXm/vS3rZMO13xhzrtHvpKNeOb466r2FDJ21XgIe7eUuR1IZFXkVt4QeT1vRWMlcCdoM8XTWisZS5WlzIYmJdCYftJGwStOms4UgjlxoY7oooCMjLUFliutIMyY8Mh/QIceKNcdkAR3F4i8O2TQMMIXIf2GY1tZujg3ysBnGmAAP0xD5ENJb/vKMyim789iTT3FoIMKhwQiHB6PK+TUY5dBgZEKCvmqPnXZrAqrderTVqO2yapf2d2vKlooK6PA5baqQXcvE7B3RZDrv+jpsib5zOMaLR4M8uKtnzIxwLg1va42blhqVkbOlpuD+Wh5w43bo5R9N+VF2op4Oj8M2ac5tUPd93cEYnUMxOoeidA5H6RyK0jWN86vW62BZwKXS7waUxXO5ZfVcFlBZOXUNLc1io6JEPR1mUd7t81ZPTMObymTpCcaV8ysY49hIPO8COzIY5akDg5Mu+9T7HDRVKbtnk2XxbApYW2351JSAJSPqmbCbxowGkHAiTbdl9ewJxjkWjCnnVzBO13CMZw8PMxxNTXidw2bQVGzx9DtprHLR4Heqh09ta70OfZ+vOWm0qI8Dn9PG2iY/a5umzgUeTynLZ29Iib13VLm/ekfj9I4m2NMb4g/7BqY0e1R77NTncm/7nHmLp8rB7aTGo45rvcr1ZdNfAppxaFHPMS67SXudirWejlgyo/JvhxP0h5TjayCUZCCcUPvhJC/3jDIUSTIySe+fI+C2W5ZPta0eZ/2sdqvjQJH9U7u7Khst6hLhdpgqo0qdd8ZrU5ksw1GVe1vl4rb2I8n8+ZFoimMjcV46NspwNDVp8EcOmyGU5dPydk9m/axyFXJzV7nt+J3KCupz2fDqL4VFjRZ1GWA3jaJE/LMjnspYebiV4EeiyXwe7pFYwQIajKYYiiQ5NBDJ5+WeKhgkR84L7s8n3Z/B/ulQXwS5/VzObrfDGGMFddlNbfOcA8pK1PFUlnAirSs6zgKX3aQ5YNIcmP0XAahgkFgqw2hM2T1H42lGLQto2LKAhhPK6pmzgOZsn4PhJJGkytcdTabH1OOeLQ5T+bld4z3eNgOnreDxdtgMnGZhP2cHVY6rXHpd5cQqOLOURdRmFFxbuXS9ZpFFVORT+DJlEn8ouMYm+S1av8upk/rnLKI5l1omKwsPKclkZJFlNJu3iqaykswMNtGyUsfevhCnffZBqj12WmtytZtVrHJLjYeWajettW6qXNoeeqIIIaxSN7bj/kIYTyYriY7xdWfGJOPPWUFz53KJ+ROWLVTZQQvJ+RMpFXSSsJL0J9OFqhWqioXK773UKStRt9d6+OibNuRNI3t6Qzz6Sh+JcWVI/E4bLTVj84Mtr1Ymktz6scOmZ43nG9MQVkjmwn3JSikLgQ9plaA/nSmUtMn1epmiwImslHnfd3GwhepR1ZcTFPzg6nNy/XHhc4vnGYp7c0EumX8usX+xD9zyfgvyIwbDENitQBPTGlHYDQPTFFYgikHdLVP/DspK1AG3nQ9cvHrMOSklA+FkUX6wqLWNc3QkxrbDwwRjE2eP633OgmEk4FS5wQJumqrUfmOViyqXNo2UG0KIfEQWx18FqCIoK1FPhhAib+IYn9Q/x1Smke5gnK7hKNsOD026bOS2m8o0YvXujX7nWBOJzhOmWYSUvahnw2xMI7FkxjKIxOmxtspEkqA3qPKE9c6QJyz35VLvU/nC6q199VDHunC7Zr5ZEqKeDW6HSUe9l476qdeNpZSEE2n6QomxucLCCfpH1bZzKMpzh4cZiiYnrdnsMI28I6zW67CSAzrziQFrvcokksshVu3RRds1x4cW9XEgRGHiZ3XD9HnC0pksQ9HkWJdYKMnAuCLuhwYjDIWT06YE8jttVHtVYsCAuyhBoNtOwHKJjTeTBNx2nTl0iaJFPU/YjtMwkkhnGI6k8gkCc26x4Ygq4j4STVoF3VN0DkUZjqpcYdPluHDYDKpcdgJu2xiXWC5ZYLFrzOe0K0NJ/tiGz2XToaVliBb1IsFpO36zSDYrCcXTjMQKbrFgUXLAYCzFaCytkgbGlZOscyjKqGUqSaZnXtO1mwKf5RrzFbnFcu4xr9PEYznG3A7TWuNW+257UQJBR7FzTCURnLZuuOaEKStRp618UfqPQWEYhayhJ0IinRmTLDAUV+6wcD55YCZ/nHeOWQkFe4JxlTwwlSGayJyQ6aPYPeayK8dYzj3mGOcgy523m8aYpIJqa+Xxshn5ddziRIP2oqLuuSSD+TVhMXF/vJMst19cSB5yiQcn/i3mUoQVu8ms/wrJB7MTnWUq+WBhrbx4DT2dS0poOc2mo6xE/XL3KOs/cz9NVS6WB9w0B1xWRhIXzQG1zrws4KLe59Qe4lngtJk4feYJZRAdTyqTVS6xZIZIMk08lck7yeKpia6xWDJDIp0lbjnIEqls0bFyio1Ek2o/k80nF0wVOclm+uNeqpSVqJdXu3n/havya84vdI7wwK74hF7CNIS1puyyTCW5mlTOovpUTnx6eWnOsJsGAbdBwL2w7rGcNTSdyVpb1bPlnGTpom0mS/44I9WoLzf6y1i9Y673zFgZRKXVg8p8qt+xvXBxW8Y4yop6cyy/uBCFLKJYowDTyI0Kct5zdWyzRhemEHnferHT7NRKcZTVeR184rINY85ls5LhaDJvLOkejdMbVMaS3tE4+/rDPLlvgFBiYlICj8PMZx5RRpLCWnPDmDVmp7aVLkKEEDhsQv/bjKOsRD0ZhiFUMTifc9IMozkiiXQ++0jvaJy+kNrvCyXoD8XZ3RPiidDUGUmqXLa8maTBZxWhs9aX632FteY6r4Mql13f92tKRtmLerZ4nTZWNfhYNcP6cjyVsbKRqOwjaqseg+Ek/eEEL/eMMhhOTuopBzX8r/E4ClUnfQ5qPQ5VmM5jH1OgLleYTmcj0cwVS0bUs8VlN/NZR2cimVYZSXKCzxlKBsMJhqPJ/LmXu0cZjqh15qnWlR2mQcBjL6QisqpOVluGk/EPte6s1py140xTTKkK5H0BuALIAn3AdVLKY6Voy8mgsoSqibfZkMlKgrHUmFREI9Ekw9FUPjuJOpfiyFCU7V1qf3xo6XjcdjOfiqi4AqXfZbeqUFqGElfBYJIzl+TWoD12vW5cKZSqp/6alPIzAEKIDwM3AzMWyCt3TEPkPd/HQzyVsYwkRWmIrNRDo8X71lrzSDSZN5mE4ukZvxRAzcx67GbeZDI+LZHXYcPtMPNmk5yxpNhwkktNVLzvtKv1ZX1rsXCURNRSytGiQy9j480148jl75rtiGA8yXRWmUkSGUKJ1Jg0RLlUROH4NFUprf1IUm0zx7k+LAQ4bYYSuc1ylOXTFBWEnzOfOIoMKCo9kYndNnUlS5W6SC332EwxLoWRMcZwYjMLaYsK1S3FhMJ1ymwyv19EctIqmOSL8uXNJ3nTSTZvSpmOkt1TCyG+BLwHCAKXzuY1R4bmr5R1JeOwGdYKwcm/l5RqXViZTJSJpDg9USyZIZZK56tUFkwnVooiK1VRzmSSc7UNpgvPjU9VdLxfInPF+IqVomi9Gca6y1bWezk4ELF+R+pcfm1bHag8ZbIg5nlr93xVvRRCPAw0T/LUp6WUvyy67ibAJaX87BTvcyNwo3W4Htg9121dAOqBgVI3YoHRP/P8skJK2TDZEyUvZSuEaAfuk1KeVtKGzCNCiG1TlR2tVPTPXDpKshYihFhbdHgF8Eop2qHRVCKluqf+ihBiPWpJ6zBLYOZbo1koSjX7/Y5SfG4JubXUDSgB+mcuESW/p9ZoNHOL9hdqNBWGFvUCI4T4qBBCCiHqS92W+UQI8TUhxCtCiB1CiLuFENWlbtN8IYS4TAixWwixTwjxyVK3R4t6ARFCtAFvBI6Uui0LwEPAaVLKTcAe4KYSt2deEEKYwHeANwGnAFcJIU4pZZu0qBeWbwAfZwnYYqWUv5VS5oLTnwJaS9meeeQcYJ+U8oCUMgnciVqmLRla1AuEEOIK4KiUcnup21ICrgfuL3Uj5okWoLPouMs6VzJ0PPUcMp01FvgUauhdMczGCiyE+DSQBm5fyLYtZbSo5xAp5esnOy+EOB1YCWy3In9ageeEEOdIKXsWsIlzylQ/bw4hxHXAW4AtsnLXTo8CbUXHrda5kqHXqUuAEOIQcJaUsmIDHoQQlwFfBy6WUvaXuj3zhRDChpoI3IIS81bgainli6Vqk+6pNfPFtwEn8JA1OnlKSllxdmApZVoI8SHgQcAEvl9KQYPuqTWaikPPfms0FYYWtUZTYWhRazQVhha1RlNhaFFrNBWGFrXmuBFCPCCEGBFC/LrUbdFMRItacyJ8Dbi21I3QTI4WtWZKhBBnW/HQLiGEVwjxohDiNCnlI0Co1O3TTI52lGmmREq5VQjxK+CLgBv4kZRyV4mbpZkBLWrNTHwe5WeOAx8ucVs0s0APvzUzUQf4AD9wYsW8NAuKFrVmJv4L+AwqHvqWErdFMwv08FszJUKI9wApKeUdVi6uPwohXgf8C7AB8AkhuoAbpJQPlrKtmgI6SkujqTD08FujqTC0qDWaCkOLWqOpMLSoNZoKQ4tao6kwtKg1mgpDi1qjqTC0qDWaCuP/Axg178oc2p4iAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def rmsprop_2d(x1, x2, s1, s2):\n",
    "    g1, g2, eps = 0.2*x1, 4*x2, 1e-6\n",
    "    s1 = gamma*s1+(1-gamma)*g1**2\n",
    "    s2 = gamma*s2+(1-gamma)*g2**2\n",
    "    x1 -= eta / math.sqrt(s1+eps)*g1\n",
    "    x2 -= eta / math.sqrt(s2+eps)*g2\n",
    "    return x1, x2, s1, s2\n",
    "def f_2d(x1, x2):\n",
    "    return 0.1*x1**2+2*x2**2\n",
    "eta, gamma = 0.4, 0.9\n",
    "d2l.show_trace_2d(f_2d, d2l.train_2d(rmsprop_2d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "features, labels = d2l.get_data_ch7()\n",
    "def init_rmsprop_states():\n",
    "    s_w = torch.zeros((features.shape[1], 1), dtype=torch.float32)\n",
    "    s_b = torch.zeros(1, dtype=torch.float32)\n",
    "    return (s_w, s_b)\n",
    "def rmsprop(params, states, hyperparams):\n",
    "    gamma, eps = hyperparams['gamma'], 1e-6\n",
    "    for p, s in zip(params, states):\n",
    "        s.data = gamma * s.data + (1-gamma) * (p.grad.data)**2\n",
    "        p.data -= hyperparams['lr']*p.grad.data / torch.sqrt(s+eps)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.245565, 0.208567 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.train_ch7(rmsprop, init_rmsprop_states(), {'lr': 0.01, 'gamma': 0.9}, features, labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.243149, 0.128298 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.train_pytorch_ch7(torch.optim.RMSprop, {'lr': 0.01, 'alpha': 0.9}, features, labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6.7 AdaDelta算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "features, labels = d2l.get_data_ch7()\n",
    "def init_adadelta_states():\n",
    "    s_w, s_b = torch.zeros((features.shape[-1], 1), dtype=torch.float32), torch.zeros(1, dtype=torch.float32)\n",
    "    delta_w, delta_b = torch.zeros((features.shape[-1], 1), dtype=torch.float32), torch.zeros(1, dtype=torch.float32)\n",
    "    return ((s_w, delta_w), (s_b, delta_b))\n",
    "def adadelta(params, states, hyperparams):\n",
    "    rho, eps = hyperparams['rho'], 1e-5\n",
    "    for p, (s, delta) in zip(params, states):\n",
    "        s[:] = rho*s+(1-rho)*(p.grad.data**2)\n",
    "        g = p.grad.data*torch.sqrt((delta+eps)/(s+eps))\n",
    "        p.data -= g\n",
    "        delta[:] = rho*delta+(1-rho)*g*g"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.244431, 0.208847 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.train_ch7(adadelta, init_adadelta_states(), {'rho': 0.9}, features, labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.266846, 0.202872 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.train_pytorch_ch7(torch.optim.Adadelta, {'rho': 0.9}, features, labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6.8 Adam算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "features, labels = d2l.get_data_ch7()\n",
    "def init_adam_states():\n",
    "    v_w, v_b = torch.zeros((features.shape[1], 1), dtype=torch.float32), torch.zeros(1, dtype=torch.float32)\n",
    "    s_w, s_b = torch.zeros((features.shape[1], 1), dtype=torch.float32), torch.zeros(1, dtype=torch.float32)\n",
    "    return ((v_w, s_w), (v_b, s_b))\n",
    "def adam(params, states, hyperparams):\n",
    "    beta1, beta2, eps = 0.9, 0.999, 1e-6\n",
    "    for p, (v, s) in zip(params, states):\n",
    "        v[:] = beta1*v + (1-beta1)*p.grad.data\n",
    "        s[:] = beta2*s + (1-beta2)*p.grad.data**2\n",
    "        v_bias_corr = v/(1-beta1**hyperparams['t'])\n",
    "        s_bias_corr = s/(1-beta2**hyperparams['t'])\n",
    "        p.data -= hyperparams['lr']*v_bias_corr/(torch.sqrt(s_bias_corr)+eps)\n",
    "    hyperparams['t'] += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.243669, 0.228965 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.train_ch7(adam, init_adam_states(), {'lr': 0.01, 't': 1}, features, labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: 0.243203, 0.139672 sec per epoch\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 252x180 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "d2l.train_pytorch_ch7(torch.optim.Adam, {'lr': 0.01}, features, labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:PyTorch] *",
   "language": "python",
   "name": "conda-env-PyTorch-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
